Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 603 - (show annotations) (download) (as text)
Mon Nov 5 19:36:36 2007 UTC (16 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 64022 byte(s)
-fixed count_protected_files() and obsoleted writeprotected script

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.34 2007-11-05 19:34:36 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 ${MAGERC}."
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 ${MAGERC}."
1185 fi
1186
1187 local i
1188 for i in ${RSYNC}
1189 do
1190 rsync ${RSYNC_FETCH_OPTIONS} ${i} ${MAGEDIR}
1191 if [[ $? = 0 ]]
1192 then
1193 break
1194 else
1195 continue
1196 fi
1197 done
1198
1199 # clean up backup files (foo~)
1200 find ${MAGEDIR} -name *~ -exec rm '{}' ';'
1201
1202 # check if an newer mage version is available
1203 is_newer_mage_version_available
1204 }
1205
1206 cleanpkg()
1207 {
1208 if [ -d "${PKGDIR}" ]
1209 then
1210 echo -n "Removing downloaded packages... "
1211 rm -rf ${PKGDIR}/*
1212 echo "done."
1213 fi
1214 }
1215
1216 xtitle()
1217 {
1218 if [[ ${TERM} = xterm ]]
1219 then
1220 echo -ne "\033]0;Mage: $1\007"
1221 fi
1222 return 0
1223 }
1224
1225
1226 xtitleclean()
1227 {
1228 if [[ ${TERM} = xterm ]]
1229 then
1230 echo -ne "\033]0;\007"
1231 fi
1232 return 0
1233 }
1234
1235
1236 # cuts full pathnames or versioniezed names down to basename
1237 choppkgname()
1238 {
1239 #we want this only if full name was used
1240 if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1241 then
1242 #cuts ARCH and PBUILD
1243 #ARCH comes from ${MAGERC}
1244 MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
1245
1246 #cuts version number
1247 MAGENAME=$(basename ${MAGENAME%-*} .mage)
1248 fi
1249 }
1250
1251 # get_categorie $PNAME, returns CATEGORIE
1252 # $1=pname
1253 # ret 0=ok, 1=not_found
1254 pname2pcat()
1255 {
1256 local pname="$1"
1257 local repo="$2"
1258 local pcat
1259 local categorie
1260
1261 for pcat in ${MAGEDIR}/*
1262 do
1263 if [ -d ${pcat}/${pname} ]
1264 then
1265 categorie=$(basename ${pcat})
1266 fi
1267 done
1268
1269 echo "${categorie}"
1270 }
1271
1272 # check_stable_package /path/to/foo.mage
1273 # returns 0=stable 1=unstable
1274 check_stable_package()
1275 {
1276 # first check if this magefile is not blacklisted
1277 blacklisted "$1" || return 1
1278
1279 local STATE
1280 STATE="$(get_value_from_magefile STATE "$1")"
1281
1282 # state testing
1283 if [[ ${USE_TESTING} = true ]] || [[ ${MAGE_DISTRIBUTION} = testing ]]
1284 then
1285 case ${STATE} in
1286 testing|stable) return 0 ;;
1287 *) return 1 ;;
1288 esac
1289 fi
1290
1291 # state unstable
1292 if [[ ${USE_UNSTABLE} = true ]] || [[ ${MAGE_DISTRIBUTION} = unstable ]]
1293 then
1294 case ${STATE} in
1295 unstable|testing|stable) return 0 ;;
1296 *) return 1 ;;
1297 esac
1298 fi
1299
1300 # no use_state given = stable
1301 case ${STATE} in
1302 stable) return 0 ;;
1303 *) return 1 ;;
1304 esac
1305 }
1306
1307
1308 # get_highest_magefile ${PCAT} ${PNAME}
1309 # fake at moment returns only stable pkgs (must set to be one)
1310 # return $HIGHEST_MAGEFILE
1311 get_highest_magefile()
1312 {
1313 local HIGHEST_MAGEFILE
1314 local PCAT="$1"
1315 local PNAME="$2"
1316 local magefile
1317
1318 for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*)
1319 do
1320 # we exclude subdirs (for stuff like a md5sum dir)
1321 [ -d ${magefile} ] && continue
1322 if check_stable_package ${magefile}
1323 then
1324 HIGHEST_MAGEFILE=${magefile}
1325 #for debug only
1326 [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1327 fi
1328 done
1329
1330 # do not so anything
1331 # # stop here if HIGHEST_MAGEFILE is zero
1332 # # this package must be unstable or old
1333 # if [ -z "${HIGHEST_MAGEFILE}" ]
1334 # then
1335 # echo
1336 # echo -n "All packages named "
1337 # echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1338 # echo -n " are marked "
1339 # echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1340 # echo "."
1341 # echo "You need to declare USE_UNSTABLE=true to install this."
1342 # echo
1343 # echo "Example:"
1344 # echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1345 # echo
1346 # echo "Be warned that these packages are not stable and may cause serious problems."
1347 # echo "You should know what you are doing, so don't complain about any damage."
1348 # echo
1349 # return 1
1350 # fi
1351
1352 echo "${HIGHEST_MAGEFILE}"
1353 return 0
1354 }
1355
1356
1357 ###################################################
1358 # function is_config_protected #
1359 # is_config_protected /path/to/file #
1360 # #
1361 # returns: #
1362 # 0 - not protected #
1363 # 1 - error #
1364 # 2 - protected #
1365 # 3 - protected but masked #
1366 # #
1367 ###################################################
1368 is_config_protected()
1369 {
1370 local EXPFILE
1371 local TEST
1372 local PROTECTED
1373 local IFS
1374
1375 EXPFILE="${MROOT}$1"
1376
1377 # file does not exist; it can be written
1378 [[ ! -e ${EXPFILE} ]] && return 0
1379
1380 # to be safe; it may be '§'
1381 IFS=' '
1382
1383 # check ob in config protect
1384 for i in ${CONFIG_PROTECT}
1385 do
1386 # ersetzen von $i nur wenn am anfang der variable
1387 TEST="${EXPFILE/#${MROOT}${i}/Protected}"
1388 if [[ ${TEST} != ${EXPFILE} ]]
1389 then
1390 # setzen das es protected ist
1391 PROTECTED=TRUE
1392
1393 # check ob nicht doch maskiert
1394 for x in ${CONFIG_PROTECT_MASK}
1395 do
1396 TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"
1397 if [[ ${TEST} != ${EXPFILE} ]]
1398 then
1399 PROTECTED=MASKED
1400 fi
1401 done
1402 fi
1403 done
1404
1405 unset IFS
1406
1407 case ${PROTECTED} in
1408 TRUE)
1409 #echo "I'm protected"
1410 return 2
1411 ;;
1412 MASKED)
1413 #echo "I'm protected, but masked - delete me"
1414 return 3
1415 ;;
1416 *)
1417 #echo "delete me"
1418 return 0
1419 ;;
1420 esac
1421 }
1422
1423
1424 ###################################################
1425 # function count_protected_files #
1426 # count_protected_files /path/to/file #
1427 # #
1428 # note: prints number of protected files #
1429 # exp: 0012 #
1430 ###################################################
1431 count_protected_files()
1432 {
1433 local file="$1"
1434 local dirname="${file%/*}"
1435 local filename="${file##*/}"
1436 local count
1437 local output
1438 local i
1439
1440 declare -i count=0
1441
1442 # check if there are already protected files
1443 for oldpretected in $(find ${dirname} -iname "._cfg????_${filename}" |
1444 sed -e "s:\(^.*/\)\(._cfg*_\)\(/.*$\):\1\2\3\%\2\%\3:" |
1445 sort -t'%' -k3 -k2 | cut -f1 -d'%')
1446 do
1447 count=$(echo ${oldpretected} | cut -d_ -f2 | sed -e "s:cfg::")
1448 done
1449 (( count ++ ))
1450
1451 # fill output up with zeros
1452 for (( i=${#count}; i < 4; i++ )); do output="${output}0"; done
1453 output="${output}${count}"
1454
1455 echo "${output}"
1456 }
1457
1458 # call with
1459 # 'get_uninstall_candidates (--pcat cat --protected pcat/pfull) --pname PNAME'
1460 # returns /path/to/magefile(s)
1461 get_uninstall_candidates()
1462 {
1463 local search_pname
1464 local pkg
1465 local pcat
1466 local pname
1467 local pver
1468 local pbuild
1469 local list
1470 local pcatdir
1471 local protected
1472 local i
1473
1474 # very basic getops
1475 for i in $*
1476 do
1477 case $1 in
1478 --pcat|-c) shift; pcatdir="$1" ;;
1479 --pname|-n) shift; search_pname="$1" ;;
1480 --protected|-p) shift; protected="$1" ;;
1481 esac
1482 shift
1483 done
1484
1485 # it's not good to complain here about empty pnames; better to continue later anyway
1486 # # sanity checks; abort if not given
1487 # [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."
1488
1489
1490 # check needed global vars
1491 [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."
1492
1493 # set pcatdir to '*' if empty
1494 [ -z "${pcatdir}" ] && pcatdir='*'
1495
1496 for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*
1497 do
1498 # abort if not a dir
1499 [ ! -d ${pkg} ] && continue
1500
1501 pname="$(magename2pname ${pkg})"
1502
1503 if [[ ${search_pname} = ${pname} ]]
1504 then
1505 pcat="$(magename2pcat ${pkg} installdb)"
1506 pver="$(magename2pver ${pkg})"
1507 pbuild="$(magename2pbuild ${pkg})"
1508
1509 # exclude proteced
1510 [[ ${protected} = ${pcat}/${pname}-${pver}-${pbuild} ]] && continue
1511
1512 list="${list} ${pcat}/${pname}-${pver}-${pbuild}"
1513 fi
1514 done
1515
1516 echo "${list}"
1517 }
1518
1519 # reads virtualdb file
1520 #$1 = virtualname; $2 commands: showpkgs, showline
1521 #return 0 == installed -> shows installed pkg as well
1522 #return 1 == not installed
1523 virtuals_read()
1524 {
1525 local virtualname="$1"
1526 local command="$2"
1527 local virtline
1528 local line x i
1529
1530 # parse file to get virtual_name line
1531 IFS=$'\n'
1532 for line in $(< ${MROOT}${VIRTUALDB_FILE})
1533 do
1534 IFS=$' '
1535 for x in ${line}
1536 do
1537 if [[ ${x} = ${virtualname} ]]
1538 then
1539 virtline="${line}"
1540 [[ ${command} = showline ]] && echo "${line}"
1541 fi
1542 done
1543 IFS=$'\n'
1544 done
1545
1546 unset IFS
1547
1548 # now read the packages linked to VIRTUAL_NAME and output them
1549 if [ -n "${virtline}" ]
1550 then
1551 if [[ ${command} = showpkgs ]]
1552 then
1553 declare -i x=0
1554 for i in ${virtline}
1555 do
1556 if [ ${x} -ge 1 ]
1557 then
1558 echo "${i}"
1559 fi
1560 ((x++))
1561 done
1562 fi
1563 return 0
1564 fi
1565 return 1
1566 }
1567
1568
1569 #add pkg to virtualdb
1570 # $1 == virtualname $2= pkgname
1571 # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1572 virtuals_add()
1573 {
1574 local virtualname="$1"
1575 local pkgname="$2"
1576 local oldline
1577 local line i
1578 local installed_file
1579 local OLDIFS
1580
1581 if virtuals_read ${virtualname}
1582 then
1583 # make sure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1584 for i in $(virtuals_read ${virtualname} showpkgs)
1585 do
1586 if [[ ${i} = ${pkgname} ]]
1587 then
1588 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1589 echo "${pkgname} already linked as ${virtualname} ..."
1590 #return 3
1591 return 0
1592 fi
1593 done
1594
1595 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1596 echo "updating ${virtualname} entry with ${pkgname} ..."
1597 oldline="$(virtuals_read ${virtualname} showline)"
1598
1599 # make a backup
1600 mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old
1601
1602 OLDIFS="${IFS}"
1603 IFS=$'\n'
1604 for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)
1605 do
1606 # if the right line, append ${pkgname}, else do nothing
1607 if [[ ${line} = ${oldline} ]]
1608 then
1609 echo "${line} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1610 else
1611 echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}
1612 fi
1613 done
1614 # unset IFS
1615 IFS="${OLDIFS}"
1616 else
1617 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
1618 echo "register ${pkgname} as ${virtualname} ..."
1619 echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1620 fi
1621
1622 return 0
1623 }
1624
1625 #deletes pakages from virtual database
1626 #$1 virtualname; $2 pkgname
1627 virtuals_del() {
1628
1629 local virtualname="$1"
1630 local pkgname="$2"
1631 local oldline
1632 local method
1633 local line i x
1634 local pkg_installed
1635 local OLDIFS
1636
1637 # first check if exists
1638 if virtuals_read ${virtualname}
1639 then
1640 # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1641 declare -i x=0
1642 for i in $(virtuals_read ${virtualname} showpkgs)
1643 do
1644 if [[ ${i} = ${pkgname} ]]
1645 then
1646 pkg_installed=true
1647 fi
1648 ((x++))
1649 done
1650
1651 # abort if not installed
1652 if [[ ${pkg_installed} != true ]]
1653 then
1654 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1655 echo "${pkgname} does not exists in ${virtualname}."
1656 return 0
1657 fi
1658
1659 if [ ${x} -ge 2 ]
1660 then
1661 method=update
1662 else
1663 method=delall
1664 fi
1665
1666 # get the complete line
1667 oldline="$(virtuals_read ${virtualname} showline)"
1668
1669 # make a backup of the db
1670 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1671
1672 # parse virtualdb
1673 OLDIFS="${IFS}"
1674 IFS=$'\n'
1675 for line in $(< ${VIRTUALDB_FILE}.old)
1676 do
1677 if [[ ${line} = ${oldline} ]]
1678 then
1679 #delall or update?
1680 case ${method} in
1681 update)
1682 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1683 echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..."
1684 # del PKG_NAME from line
1685 echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE}
1686 ;;
1687 delall)
1688 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
1689 echo "Deleting ${virtualname} in virtual database ..."
1690 # continue; do not write anything
1691 continue
1692 ;;
1693 esac
1694 else
1695 echo "${line}" >> ${VIRTUALDB_FILE}
1696 fi
1697 done
1698 # unset IFS
1699 IFS="${OLDIFS}"
1700 else
1701 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1702 echo "${virtualname} does not exists in virtual database."
1703 fi
1704 }
1705
1706 # gets real pkgname from virtuals.default
1707 #$1=VIRTUAL_NAME; returns PKG_NAME
1708 default_virtualname_to_pkgname()
1709 {
1710 local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1711
1712 VIRTUAL_NAME=$1
1713
1714 while read db_virtualname db_pkgname
1715 do
1716 if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1717 then
1718 PKG_NAME="${db_pkgname}"
1719 fi
1720 done << EOF
1721 $(< ${VIRTUALDB_DEFAULTS})
1722 EOF
1723
1724 if [ -n "${PKG_NAME}" ]
1725 then
1726 echo "${PKG_NAME}"
1727 fi
1728 }
1729
1730 minclude()
1731 {
1732 local i
1733
1734 if [[ -n $* ]]
1735 then
1736 for i in $*
1737 do
1738 [[ ${MAGEDEBUG} = on ]] && \
1739 echo "--- Including ${MAGEDIR}/include/${i}.minc"
1740 source ${MAGEDIR}/include/${i}.minc
1741 done
1742 [[ ${MAGEDEBUG} = on ]] && echo
1743 fi
1744 }
1745
1746 sminclude()
1747 {
1748 local i
1749
1750 if [[ -n $* ]]
1751 then
1752 for i in $*
1753 do
1754 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1755 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1756 done
1757 echo
1758 fi
1759 }
1760
1761 # checks if an newer mage version is available
1762 is_newer_mage_version_available()
1763 {
1764 local newest_mage
1765 local installed_mage
1766
1767 newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)"
1768 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1769
1770 if [[ ${newest_mage} > ${installed_mage} ]]
1771 then
1772 echo
1773 echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1774 echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1775 echo "It is recommened to install this newer version"
1776 echo "or your current system installation may break."
1777 echo
1778 echo -en "Please update mage by running "
1779 echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1780 echo
1781 fi
1782 }
1783
1784
1785 # returns pname from pkgname
1786 # pkgname2pname $PKGNAME
1787 pkgname2pname()
1788 {
1789 local pname
1790
1791 pname="${1%-*-*-*}"
1792 echo "${pname}"
1793 }
1794
1795 # returns pver from pkgname
1796 # pkgname2pver $PKGNAME
1797 pkgname2pver()
1798 {
1799 local i pver
1800
1801 i="${1/$(pkgname2pname $1)-/}"
1802 pver="${i%-*-*}"
1803 echo "${pver}"
1804 }
1805
1806 # returns pbuild from pkgname
1807 # pkgname2pbuild $PKGNAME
1808 pkgname2pbuild()
1809 {
1810 local pbuild
1811
1812 pbuild="${1##*-}"
1813 echo "${pbuild}"
1814 }
1815
1816 # returns parch from pkgname
1817 # pkgname2parch $PKGNAME
1818 pkgname2parch()
1819 {
1820 local i x parch
1821
1822 i="${1%-*-*}-"
1823 x="${1%-*}"
1824 parch="${x/${i}/}"
1825 echo "${parch}"
1826 }
1827
1828 # returns pname from magename
1829 # magename2pname /PATH/TO/MAGE/FILE
1830 magename2pname()
1831 {
1832 local i pname
1833
1834 i="$(basename $1 .mage)"
1835 pname="${i%-*-*}"
1836 echo "${pname}"
1837 }
1838
1839 # returns pver from magename
1840 # magename2pver /PATH/TO/MAGE/FILE
1841 magename2pver()
1842 {
1843 local i pver
1844
1845 i="$(basename $1 .mage)"
1846 i="${i/$(magename2pname $1)-/}"
1847 pver="${i%-*}"
1848 echo "${pver}"
1849 }
1850
1851 # returns pbuild from magename
1852 # magename2pbuild /PATH/TO/MAGE/FILE
1853 magename2pbuild()
1854 {
1855 local i pbuild
1856
1857 i="$(basename $1 .mage)"
1858 pbuild="${i##*-}"
1859 echo "${pbuild}"
1860 }
1861
1862 # returns pcat from magename
1863 # magename2pcat /PATH/TO/MAGE/FILE
1864 magename2pcat()
1865 {
1866 local i pcat
1867
1868 if [[ ${2} = installdb ]]
1869 then
1870 # go 1 dir back
1871 i="${1%/*}"
1872 else
1873 # go 2 dirs back
1874 i="${1%/*/*}"
1875 fi
1876
1877 # get basename
1878 pcat="${i##*/}"
1879 echo "${pcat}"
1880 }
1881
1882 # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION)
1883 # dep2pcat DEPEND
1884 dep2pcat()
1885 {
1886 local pcat
1887
1888 pcat="${1%/*}"
1889 echo "${pcat}"
1890 }
1891
1892 # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION)
1893 # $2=virtual is used to resolv VDEPEND from virtual packages
1894 # dep2pcat DEPEND (virtual)
1895 dep2pname()
1896 {
1897 local pname
1898
1899 pname="${1##*/}"
1900
1901 # cut version only if not virtual or it will cut the name
1902 if [[ $(dep2pcat $1) != virtual ]] && \
1903 [[ $2 != virtual ]]
1904 then
1905 pname="${pname%-*}"
1906 fi
1907
1908 echo "${pname}"
1909 }
1910
1911 dep2highest_magefile()
1912 {
1913 local pcat
1914 local pname
1915 local magefile
1916 local installed_virtuals
1917
1918 pcat="$(dep2pcat $1)"
1919 pname="$(dep2pname $1)"
1920
1921 if [[ ${pcat} = virtual ]]
1922 then
1923 # first check if virtual is already installed
1924 installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)"
1925 if [ -n "${installed_virtuals}" ]
1926 then
1927 for vpkg in ${installed_virtuals}
1928 do
1929 realpkgname="${vpkg}"
1930 virtualpkgname="${pcat}/${pname}"
1931 pcat="$(dep2pcat ${realpkgname})"
1932 pname="$(dep2pname ${realpkgname} virtual)"
1933 done
1934 else
1935 # choose one from virtualdb defaults (virtuals.defaults)
1936 realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})"
1937 virtualpkgname="${pcat}/${pname}"
1938 pcat="$(dep2pcat ${realpkgname})"
1939 pname="$(dep2pname ${realpkgname} virtual)"
1940 fi
1941 fi
1942
1943 magefile="$(get_highest_magefile ${pcat} ${pname})"
1944 echo "${magefile}"
1945 }
1946
1947 # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD}
1948 is_installed()
1949 {
1950 local fullpkgname="$1"
1951
1952 # return 0 if installed
1953 [ -d ${MROOT}${INSTALLDB}/${fullpkgname} ] && return 0
1954
1955 return 1
1956 }
1957
1958 install_packages()
1959 {
1960 local list="$@"
1961 local pkg
1962 local pcat
1963 local pname
1964 local pver
1965 local pbuild
1966 local total_pkgs
1967 local current_pkg
1968 local src_install
1969 local uninstall_list
1970
1971 # check for --src-install
1972 if [[ $1 = --src-install ]]
1973 then
1974 # remove --src-install from list
1975 list=${list/--src-install/}
1976 # enable src-install
1977 src_install="--src-install"
1978 fi
1979
1980 # reset MAGE_PROTECT_COUNTER
1981 declare -i MAGE_PROTECT_COUNTER=0
1982 export MAGE_PROTECT_COUNTER
1983
1984 # get count of total packages
1985 declare -i total_pkgs=0
1986 declare -i current_pkg=0
1987 for i in ${list}; do (( total_pkgs++ )); done
1988
1989 echo
1990
1991 if [[ -n ${MROOT} ]]
1992 then
1993 echo -ne ${COLRED}
1994 echo "!! installing in MROOT=${MROOT}"
1995 echo -ne ${COLDEFAULT}
1996 echo
1997 fi
1998
1999 for pkg in ${list}
2000 do
2001 (( current_pkg++ ))
2002 pcat=$(magename2pcat ${pkg})
2003 pname=$(magename2pname ${pkg})
2004 pver=$(magename2pver ${pkg})
2005 pbuild=$(magename2pbuild ${pkg})
2006
2007 mage_install \
2008 --pcat ${pcat} \
2009 --pname ${pname} \
2010 --pver ${pver} \
2011 --pbuild ${pbuild} \
2012 --count-total ${total_pkgs} \
2013 --count-current ${current_pkg} \
2014 ${src_install}
2015
2016 # check for allready installed packages and remove them
2017 # except the package we have installed
2018 uninstall_list="$(get_uninstall_candidates \
2019 --pcat "${pcat}" \
2020 --pname "${pname}" \
2021 --protected ${pcat}/${pname}-${pver}-${pbuild})"
2022
2023 # uninstall all packges in uninstall_list if not empty
2024 if [ -n "${uninstall_list}" ]
2025 then
2026 echo
2027 uninstall_packages ${uninstall_list} \
2028 || die "install_packges() uninstalling not-needed."
2029 fi
2030
2031 # crlf for better view in VERBOSE mode
2032 #if [[ ${VERBOSE} = on ]]; then echo; fi
2033 echo
2034 done
2035
2036 #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}"
2037 show_etc_update_mesg
2038 }
2039
2040 # get_value_from_magefile VARIABLE
2041 # returns the content of this VAR
2042 get_value_from_magefile()
2043 {
2044 local var="$1"
2045 local magefile="$2"
2046 local value
2047
2048 [[ -z ${var} ]] && return 1
2049 [[ -z ${magefile} ]] && return 1
2050
2051 # local all possible vars of a mage file
2052 # to prevent bad issues
2053 local PKGNAME
2054 local STATE
2055 local DESCRIPTION
2056 local HOMEPAGE
2057 local DEPEND
2058 local SDEPEND
2059 local PROVIDE
2060 local PKGTYPE
2061 local preinstall
2062 local postinstall
2063 local preremove
2064 local postremove
2065
2066 # sanity checks
2067 [ -f ${magefile} ] && source ${magefile} || \
2068 die "get_value_from_magefile: ${magefile} not found."
2069 [ -z "${var}" ] && die "get_value_from_magefile: \$var not given."
2070
2071 source ${magefile}
2072 eval value=\$$(echo ${var})
2073 echo "${value}"
2074
2075 # unset these functions
2076 unset -f preinstall
2077 unset -f postinstall
2078 unset -f preremove
2079 unset -f postremove
2080 }
2081
2082 mage_install()
2083 {
2084 # local all possible vars of a mage file
2085 # to prevent bad issues
2086 local PKGNAME
2087 local STATE
2088 local DESCRIPTION
2089 local HOMEPAGE
2090 local DEPEND
2091 local SDEPEND
2092 local PROVIDE
2093 local PKGTYPE
2094 local preinstall
2095 local postinstall
2096 local preremove
2097 local postremove
2098
2099 local pcat
2100 local pname
2101 local pver
2102 local pbuild
2103 local count_total
2104 local count_current
2105 local magefile
2106 local src_install
2107
2108 # very basic getops
2109 for i in $*
2110 do
2111 case $1 in
2112 --pcat|-c) shift; pcat="$1" ;;
2113 --pname|-n) shift; pname="$1" ;;
2114 --pver|-v) shift; pver="$1" ;;
2115 --pbuild|-b) shift; pbuild="$1" ;;
2116 --count-total) shift; count_total="$1" ;;
2117 --count-current) shift; count_current="$1" ;;
2118 --src-install|-s) shift; src_install=true ;;
2119 esac
2120 shift
2121 done
2122
2123 # sanity checks; abort if not given
2124 [ -z "${pcat}" ] && die "mage_install() \$pcat not given."
2125 [ -z "${pname}" ] && die "mage_install() \$pname not given."
2126 [ -z "${pver}" ] && die "mage_install() \$pver not given."
2127 [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given."
2128
2129 # check needed global vars
2130 [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set."
2131 [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set."
2132 [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set."
2133
2134 xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]"
2135 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2136 echo -n "installing (${count_current}/${count_total}): "
2137 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2138 echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2139
2140 magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
2141 source ${magefile}
2142
2143 # abort on sources if no srcinstall
2144 if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]]
2145 then
2146 echo
2147 echo -e "This Package is a Source Package."
2148 echo
2149 echo -e "Only 'srcinstall' works with this type of packages"
2150 echo -en "If you have done a srcinstall before, "
2151 echo -e "you will find the files in /usr/src."
2152 echo
2153 exit 1
2154 fi
2155
2156 ## preinstall scripts
2157 if [ -n "$(typeset -f preinstall)" ]
2158 then
2159 echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... "
2160 preinstall
2161 unset preinstall
2162 fi
2163
2164 if [[ ${src_install} = true ]]
2165 then
2166 local smage2file
2167 # check needed global vars
2168 [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set."
2169 [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set."
2170 [ -z "${BINDIR}" ] && die "\$BINDIR not set."
2171
2172 # build the package first
2173 if [[ ${MAGEDEBUG} = on ]]
2174 then
2175 echo M:${pname}
2176 echo V:${pver}
2177 echo B:${pbuild}
2178 fi
2179
2180 smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2181 if [ -f "${smage2file}" ]
2182 then
2183 echo -e " ${COLBLUE}***${COLDEFAULT} building package from source ... "
2184 smage2 ${smage2file} || die "compile failed"
2185 else
2186 echo
2187 echo "$(basename ${SMAGEFILE}) not found."
2188 echo "update your smage-tree and try it again."
2189 echo
2190 die
2191 fi
2192 fi
2193
2194 if [[ ${PKGTYPE} != virtual ]] && \
2195 [[ ${PKGTYPE} != sources ]]
2196 then
2197 echo -e " ${COLBLUE}***${COLDEFAULT} merging files into system ... "
2198 build_doinstall ${PKGNAME}
2199 fi
2200
2201 ## postinstall scripts
2202 if [ -n "$(typeset -f postinstall)" ]
2203 then
2204 echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... "
2205 postinstall
2206 unset postinstall
2207 fi
2208
2209 # install a database entry
2210 install_database_entry \
2211 --pcat "${pcat}" \
2212 --pname "${pname}" \
2213 --pver "${pver}" \
2214 --pbuild "${pbuild}" \
2215 --pkgname "${PKGNAME}" \
2216 --pkgtype "${PKGTYPE}" \
2217 || die "error in mage_install() running install_database_entry()."
2218
2219 # remove the package dir now
2220 if [ -d ${BUILDDIR}/${PKGNAME} ]
2221 then
2222 rm -rf ${BUILDDIR}/${PKGNAME}
2223 fi
2224
2225 # rebuilds toplevel info node
2226 if [[ ${MAGE_INFO_REBUILD} = true ]]
2227 then
2228 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2229 echo -n "rebuilding top-level info node ... "
2230 ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2231 > ${MROOT}/usr/share/info/dir && \
2232 echo "done." || echo "failure."
2233 unset MAGE_INFO_REBUILD
2234 fi
2235
2236 # rebuilds the enviroment with the content of /etc/env.d
2237 if [[ ${MAGE_ENV_REBUILD} = true ]]
2238 then
2239 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2240 echo -n "rebuilding environment ... "
2241 ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2242 echo "done." || echo "failure."
2243 unset MAGE_ENV_REBUILD
2244 fi
2245
2246 xtitleclean
2247
2248 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2249 echo -n "package "
2250 # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2251 # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2252 echo "successfully installed."
2253
2254 # unset these functions
2255 unset -f preinstall
2256 unset -f postinstall
2257 unset -f preremove
2258 unset -f postremove
2259 }
2260
2261 md5sum_packages()
2262 {
2263 local list="$@"
2264 local magefile
2265 local pcat
2266 local pname
2267 local pkgname
2268 local pkgfile
2269 local pkgtype
2270 local count_current
2271 local count_total
2272
2273 # get count of total packages
2274 declare -i count_current=0
2275 declare -i count_total=0
2276
2277 for i in ${list}; do (( count_total++ )); done
2278
2279 for magefile in ${list}
2280 do
2281 pcat=$(magename2pcat ${magefile})
2282 pname=$(magename2pname ${magefile})
2283 pkgname="$(get_value_from_magefile PKGNAME ${magefile})"
2284 md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pkgname}.md5"
2285 pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
2286 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
2287
2288 (( count_current++ ))
2289 xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]"
2290
2291 # abort on virtual pkg
2292 if [[ ${pkgtype} = virtual ]]
2293 then
2294 echo -ne " ${COLBLUE}---${COLDEFAULT}"
2295 echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2296 continue
2297 fi
2298
2299 # abort on sources pkg
2300 if [[ ${pkgtype} = sources ]]
2301 then
2302 echo -ne " ${COLBLUE}---${COLDEFAULT}"
2303 echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2304 continue
2305 fi
2306
2307 if [ -f "${md5file}" ]
2308 then
2309 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2310 echo -ne "checking md5sum (${count_current}/${count_total}): "
2311 ( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed"
2312 else
2313 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2314 echo -e "!! no md5sum file found for ${pkgfile} :("
2315 fi
2316 done
2317
2318 # add a crlf for a better view
2319 if [ ${count_total} -gt 1 ]; then echo; fi
2320 }
2321
2322 ## uninstall_packages ulist
2323 uninstall_packages()
2324 {
2325 local list="$@"
2326 local pcat
2327 local pname
2328 local pver
2329 local pbuild
2330 local can_pcat
2331 local can_pname
2332 local can_ver_list
2333
2334 if [[ -n ${MROOT} ]]
2335 then
2336 echo -ne ${COLRED}
2337 echo "!! uninstalling from MROOT=${MROOT}"
2338 echo -ne ${COLDEFAULT}
2339 echo
2340 fi
2341
2342 # generate a candidates list
2343 for pkg in ${list}
2344 do
2345 pcat=$(dep2pcat ${pkg})
2346 pname=$(magename2pname ${pkg})
2347 pver=$(magename2pver ${pkg})
2348 pbuild=$(magename2pbuild ${pkg})
2349 can_pcat="${pcat}"
2350 can_pname="${pname}"
2351
2352 if [ -z "${can_ver_list}" ]
2353 then
2354 can_ver_list=" ${pver}-${pbuild}"
2355 else
2356 can_ver_list="${can_ver_list}, ${pver}-${pbuild}"
2357 fi
2358 done
2359
2360 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2361 echo "following candidate(s) will be removed:"
2362 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2363 echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}"
2364 echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"
2365 echo
2366 if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ]
2367 then
2368 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2369 echo "( Press [CTRL+C] to abort )"
2370 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2371 echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."
2372 for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))
2373 do
2374 echo -ne "${COLRED} ${i}${COLDEFAULT}"
2375 sleep 1
2376 done
2377 echo
2378 echo
2379 fi
2380
2381 for pkg in ${list}
2382 do
2383 pcat=$(dep2pcat ${pkg})
2384 pname=$(magename2pname ${pkg})
2385 pver=$(magename2pver ${pkg})
2386 pbuild=$(magename2pbuild ${pkg})
2387
2388 mage_uninstall \
2389 --pcat ${pcat} \
2390 --pname ${pname} \
2391 --pver ${pver} \
2392 --pbuild ${pbuild} \
2393 --count-total ${total_pkgs} \
2394 --count-current ${current_pkg} \
2395 ${src_install}
2396
2397 # crlf for better view in VERBOSE mode
2398 #if [[ ${VERBOSE} = on ]]; then echo; fi
2399 echo
2400 done
2401 }
2402
2403 mage_uninstall()
2404 {
2405 # local all possible vars of a mage file
2406 # to prevent bad issues
2407 local PKGNAME
2408 local STATE
2409 local DESCRIPTION
2410 local HOMEPAGE
2411 local DEPEND
2412 local SDEPEND
2413 local PROVIDE
2414 local PKGTYPE
2415 local preinstall
2416 local postinstall
2417 local preremove
2418 local postremove
2419
2420 local pcat
2421 local pname
2422 local pver
2423 local pbuild
2424 local magefile
2425 local i
2426
2427 # very basic getops
2428 for i in $*
2429 do
2430 case $1 in
2431 --pcat|-c) shift; pcat="$1" ;;
2432 --pname|-n) shift; pname="$1" ;;
2433 --pver|-v) shift; pver="$1" ;;
2434 --pbuild|-b) shift; pbuild="$1" ;;
2435 esac
2436 shift
2437 done
2438
2439 # sanity checks; abort if not given
2440 [ -z "${pcat}" ] && die "mage_uninstall() \$pcat not given."
2441 [ -z "${pname}" ] && die "mage_uninstall() \$pname not given."
2442 [ -z "${pver}" ] && die "mage_uninstall() \$pver not given."
2443 [ -z "${pbuild}" ] && die "mage_uninstall() \$pbuild not given."
2444
2445 # check needed global vars
2446 [ -z "${MAGEDIR}" ] && die "mage_uninstall() \$MAGEDIR not set."
2447 [ -z "${INSTALLDB}" ] && die "mage_uninstall() \$INSTALLDB not set."
2448 [ -z "${BUILDDIR}" ] && die "mage_uninstall() \$BUILDDIR not set."
2449
2450 xtitle "[ (${count_current}/${count_total}) Removing ${pcat}/${pname}-${pver}-${pbuild} ]"
2451 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2452 echo -n "removing: "
2453 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2454 echo -e "${COLRED}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2455
2456 magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2457 source ${magefile}
2458
2459 ## preremove scripts
2460 if [ -n "$(typeset -f preremove)" ]
2461 then
2462 echo -e " ${COLBLUE}***${COLDEFAULT} running preremove ... "
2463 preremove
2464 unset preremove
2465 fi
2466
2467 # runs uninstall
2468 build_douninstall \
2469 --pcat "${pcat}" \
2470 --pname "${pname}" \
2471 --pver "${pver}" \
2472 --pbuild "${pbuild}"
2473
2474 ## postremove scripts
2475 if [ -n "$(typeset -f postremove)" ]
2476 then
2477 echo -e " ${COLBLUE}***${COLDEFAULT} running postremove ... "
2478 postremove
2479 unset postremove
2480 fi
2481
2482 # removes the database entry
2483 remove_database_entry \
2484 --pcat "${pcat}" \
2485 --pname "${pname}" \
2486 --pver "${pver}" \
2487 --pbuild "${pbuild}" \
2488 || die "error in mage_uninstall() running remove_database_entry()."
2489
2490 # rebuilds toplevel info node
2491 if [[ ${MAGE_INFO_REBUILD} = true ]]
2492 then
2493 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2494 echo -n "rebuilding top-level info node ... "
2495 ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2496 > ${MROOT}/usr/share/info/dir && \
2497 echo "done." || echo "failure."
2498 unset MAGE_INFO_REBUILD
2499 fi
2500
2501 # rebuilds the enviroment with the content of /etc/env.d
2502 if [[ ${MAGE_ENV_REBUILD} = true ]]
2503 then
2504 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2505 echo -n "rebuilding environment ... "
2506 ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2507 echo "done." || echo "failure."
2508 unset MAGE_ENV_REBUILD
2509 fi
2510
2511 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2512 echo -n "package "
2513 # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2514 # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2515 echo "successfully removed."
2516
2517 # unset these functions
2518 unset -f preinstall
2519 unset -f postinstall
2520 unset -f preremove
2521 unset -f postremove
2522 }
2523
2524 show_etc_update_mesg() {
2525 [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
2526
2527 echo
2528 echo -ne "${COLRED}"
2529 echo "Important:"
2530 echo -ne ${COLDEFAULT}
2531 echo "${MAGE_PROTECT_COUNTER} protected file(s) were installed."
2532 echo
2533 echo "Please run 'etc-update' to update your configuration files."
2534 echo
2535 }
2536
2537 pkgsearch()
2538 {
2539 local string="$1"
2540 local result
2541 local pkg
2542 local pcat
2543 local pname
2544 local magefile
2545 local pver
2546 local pbuild
2547 local state
2548 local descriptiom
2549 local homepage
2550 local i
2551 local all_installed
2552 local ipver
2553 local ipbuild
2554 local latest_available
2555 local depsfull
2556 local sdepsfull
2557 local deps
2558 local sdeps
2559 local dep
2560 local sign
2561
2562 # only names no versions
2563 result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name '*'${string}'*'| sed '/profiles/d' | sed '/includes/d')"
2564 #result="$(find ${MAGEDIR} -type f -name '*'${string}'*'.mage | sort)"
2565
2566 # nothing found
2567 [[ -z ${result} ]] && die "No package found containing '${string}' in the name."
2568
2569 for pkg in ${result}
2570 do
2571 # dirty, but does the job
2572 pcat="$(magename2pcat ${pkg}/foo)"
2573 pname="$(magename2pname ${pkg}-foo-foo)"
2574
2575 # get highest version available
2576 magefile=$(get_highest_magefile ${pcat} ${pname})
2577
2578 if [[ ! -z ${magefile} ]]
2579 then
2580 # now get all needed infos to print a nice output
2581 pver="$(magename2pver ${magefile})"
2582 pbuild="$(magename2pbuild ${magefile})"
2583 state="$(get_value_from_magefile STATE ${magefile})"
2584 description="$(get_value_from_magefile DESCRIPTION ${magefile})"
2585 homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
2586
2587 # all installed
2588 for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
2589 do
2590 ipver="$(magename2pver ${i})"
2591 ipbuild="$(magename2pbuild ${i})"
2592
2593 if [[ -z ${all_installed} ]]
2594 then
2595 all_installed="${ipver}-${ipbuild}"
2596 else
2597 all_installed="${all_installed} ${ipver}-${ipbuild}"
2598 fi
2599 done
2600 [[ -z ${all_installed} ]] && all_installed="none"
2601
2602 case ${state} in
2603 stable) state=${COLGREEN}"[s] ";;
2604 testing) state=${COLYELLOW}"[t] ";;
2605 unstable) state=${COLRED}"[u] ";;
2606 old) state=${COLGRAY}"[o] ";;
2607 esac
2608
2609 latest_available="${pver}-${pbuild}"
2610 else
2611 # package is masked
2612 state="${COLRED}[m] "
2613 latest_available="${COLRED}masked for this distribution.${COLDEFAULT}"
2614 fi
2615
2616 depsfull="$(get_value_from_magefile DEPEND ${magefile})"
2617 sdepsfull="$(get_value_from_magefile SDEPEND ${magefile})"
2618
2619 while read sign dep
2620 do
2621 case ${dep} in
2622 "") continue;;
2623 esac
2624
2625 deps="${deps} $(basename ${dep%-*})"
2626 done << EOF
2627 ${depsfull}
2628 EOF
2629
2630 while read sign dep
2631 do
2632 case ${dep} in
2633 "") continue;;
2634 esac
2635
2636 sdeps="${sdeps} $(basename ${dep%-*})"
2637 done << EOF
2638 ${sdepsfull}
2639 EOF
2640
2641 echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
2642 echo -e " Latest available: ${latest_available}"
2643 echo " Installed versions: ${all_installed}"
2644 echo " Description: ${description}"
2645 echo " Homepage: ${homepage}"
2646 echo " Depends: ${deps}"
2647 echo " SDepends: ${sdeps}"
2648 echo
2649
2650 unset pcat
2651 unset pname
2652 unset magefile
2653 unset pver
2654 unset pbuild
2655 unset state
2656 unset descriptiom
2657 unset homepage
2658 unset all_installed
2659 unset ipver
2660 unset ipbuild
2661 unset depsfull
2662 unset sdepsfull
2663 unset deps
2664 unset sdeps
2665 unset dep
2666 unset sign
2667 done
2668 }
2669
2670 export_inherits()
2671 {
2672 local include="$1"
2673 shift
2674
2675 while [ "$1" ]
2676 do
2677 local functions="$1"
2678
2679 # sanity checks
2680 [ -z "${include}" ] && die "export_inherits(): \$include not given."
2681 [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
2682
2683 eval "${functions}() { ${include}_${functions} ; }"
2684
2685 # debug
2686 [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"
2687
2688 shift
2689 done
2690 }
2691
2692 mlibdir()
2693 {
2694 local libdir=lib
2695 [[ ${ARCH} = x86_64 ]] && libdir=lib64
2696
2697 echo "${libdir}"
2698 }
2699
2700 ## blacklisted ${magefile}
2701 blacklisted()
2702 {
2703 [[ -z ${MAGE_DISTRIBUTION} ]] && local MAGE_DISTRIBUTION=stable
2704
2705 # compat
2706 [[ ${USE_UNSTABLE} = true ]] && local MAGE_DISTRIBUTION=unstable
2707 [[ ${USE_TESTING} = true ]] && local MAGE_DISTRIBUTION=testing
2708
2709 local EXCLUDED="${MROOT}/etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION}"
2710
2711 # return 0 if the list not exist; nothin is masked
2712 [[ ! -f ${EXCLUDED} ]] && return 0
2713
2714 local MAGEFILE="$1"
2715
2716 local PCAT="$(magename2pcat ${MAGEFILE})"
2717 local PNAME="$(magename2pname ${MAGEFILE})"
2718 local PVER="$(magename2pver ${MAGEFILE})"
2719 local PBUILD="$(magename2pbuild ${MAGEFILE})"
2720
2721 local EXPCAT EXPNAME EXPVER EXPBUILD
2722 while read EXPCAT EXPNAME EXPVER EXPBUILD
2723 do
2724 # ignore spaces and comments
2725 case "${EXPCAT}" in
2726 \#*|"") continue ;;
2727 esac
2728
2729 # exclude full pver
2730 if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
2731 [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
2732 [[ -n ${PVER} ]] && [[ -n ${PBUILD} ]] &&
2733 [[ -n ${EXPVER} ]] && [[ -n ${EXPBUILD} ]]
2734 then
2735 [[ ${EXPCAT}/${EXPNAME}-${EXPVER}-${EXPBUILD} = ${PCAT}/${PNAME}-${PVER}-${PBUILD} ]] && return 1
2736 fi
2737
2738 # exclude pcat/pname only
2739 if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
2740 [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
2741 [[ -z ${EXPVER} ]] && [[ -z ${EXPBUILD} ]]
2742 then
2743 [[ ${EXPCAT}/${EXPNAME} = ${PCAT}/${PNAME} ]] && return 1
2744 fi
2745 done << EOF
2746 $( cat ${EXCLUDED}; echo)
2747 EOF
2748
2749 return 0
2750 }
2751