Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1654 - (show annotations) (download) (as text)
Fri Jan 13 23:20:39 2012 UTC (12 years, 3 months ago) by niro
File MIME type: application/x-sh
File size: 79941 byte(s)
-honor mounted or empty $MAGEDIR in syncmage_tarball()
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.38 2008-10-05 10:32:24 niro Exp $
4
5 COLRED="\033[1;6m\033[31m"
6 COLGREEN="\033[1;6m\033[32m"
7 COLYELLOW="\033[1;6m\033[33m"
8 COLBLUE="\033[1;6m\033[34m"
9 COLMAGENTA="\033[1;6m\033[35m"
10 COLWHITE="\033[1;6m\033[37m"
11 COLGRAY="\033[0;6m\033[37m"
12 COLBOLD="\033[1m"
13 COLDEFAULT="\033[0m"
14
15 if [[ ${NOCOLORS} = true ]]
16 then
17 COLRED=""
18 COLGREEN=""
19 COLYELLOW=""
20 COLBLUE=""
21 COLMAGENTA=""
22 COLWHITE=""
23 COLGRAY=""
24 COLBOLD=""
25 COLDEFAULT=""
26 fi
27
28 mage_setup()
29 {
30 [ ! -d ${MROOT}${INSTALLDB} ] && \
31 install -d ${MROOT}${INSTALLDB}
32 [ ! -f ${MROOT}${VIRTUALDB_FILE} ] && \
33 touch ${MROOT}${VIRTUALDB_FILE}
34 [ ! -d ${PKGDIR} ] && install -d ${PKGDIR}
35 [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR}
36 [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR}
37
38 return 0
39 }
40
41 mchecksum()
42 {
43 local i
44 local rundir
45 local file
46 local method
47 local cmd
48 local retval
49
50 # very basic getops
51 for i in $*
52 do
53 case $1 in
54 --rundir|-r) shift; rundir="$1" ;;
55 --file|-f) shift; file="$1" ;;
56 --method|-m) shift; method="$1" ;;
57 esac
58 shift
59 done
60
61 # sanity checks
62 [[ -z ${rundir} ]] && die "mchecksum(): rundir missing"
63 [[ -z ${file} ]] && die "mchecksum(): file missing"
64 [[ -z ${method} ]] && die "mchecksum(): method missing"
65
66 case ${method} in
67 md5) cmd="md5sum" ;;
68 sha256) cmd="sha256sum" ;;
69 *) die "mchecksum(): unknown method '${method}'" ;;
70 esac
71
72 if [[ -d ${rundir} ]]
73 then
74 pushd ${rundir} &> /dev/null
75 ${cmd} -c ${file} &> /dev/null
76 retval="$?"
77 popd &> /dev/null
78 else
79 retval=1
80 fi
81
82 return "${retval}"
83 }
84
85 mcheckemptydir()
86 {
87 local dir="$1"
88 local retval=1
89
90 if [[ ! -d ${dir} ]]
91 then
92 echo "mcheckemptydir(): '${dir}' is not a directory!"
93 retval=3
94 else
95 shopt -s nullglob dotglob
96 files=( ${dir}/* )
97 (( ${#files[*]} )) || retval=0
98 shopt -u nullglob dotglob
99 fi
100
101 return ${retval}
102 }
103
104 unpack_packages()
105 {
106 local list="$@"
107 local magefile
108 local pkg
109 local pkgtype
110 local count_current
111 local count_total
112 local tar_opts
113
114 # get count of total packages
115 declare -i count_current=0
116 declare -i count_total=0
117
118 for i in ${list}; do (( count_total++ )); done
119
120 for magefile in ${list}
121 do
122 pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
123 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
124
125 (( count_current++ ))
126 xtitle "[ (${count_current}/${count_total}) Unpacking ${pkg} ]"
127
128 # abort on virtual pkg
129 if [[ ${pkgtype} = virtual ]]
130 then
131 echo -ne " ${COLBLUE}---${COLDEFAULT}"
132 echo " !unpack virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
133 continue
134 fi
135
136 # abort on sources pkg
137 if [[ ${pkgtype} = sources ]]
138 then
139 echo -ne " ${COLBLUE}---${COLDEFAULT}"
140 echo " !unpack sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
141 continue
142 fi
143
144 # busybox?
145 if need_busybox_support tar
146 then
147 tar_opts="xjf"
148 else
149 tar_opts="xjmf"
150 fi
151
152 echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... "
153 tar ${tar_opts} ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"
154 done
155
156 # add a crlf for a better view
157 if [ ${count_total} -gt 1 ]; then echo; fi
158 }
159
160
161 # fix_mtime path/to/$mtime/reffile $pathto/file
162 # creates a given reference file and fixes given file
163 # returns new mtime
164 fix_mtime()
165 {
166 local reference="$1"
167 local pathto="$2"
168 local mtime
169
170 mtime=$(stat -c %Y "${reference}")
171 touch \
172 --no-create \
173 --time=mtime \
174 --reference "${reference}" \
175 "${pathto}"
176
177 echo "${mtime}"
178 }
179
180 # fix_descriptor pkgname/.dir "foo1" "foo2"
181 fix_descriptor()
182 {
183 local descriptor="$1"
184 local output
185 local i
186 shift
187
188 for i in $@
189 do
190 if [[ -z ${output} ]]
191 then
192 output="${i}"
193 else
194 output="${output}§${i}"
195 fi
196 done
197
198 echo "${output}" >> ${BUILDDIR}/${descriptor}_fixed
199 }
200
201 ###################################################
202 # function install_direcories #
203 # install_direcories $PKGNAME #
204 ###################################################
205 install_directories()
206 {
207 local pkgname="$1"
208 local pathto
209 local posix
210 local user
211 local group
212 local IFS
213
214 # sanity checks; abort if not given
215 [ -z "${pkgname}" ] && die "install_directories() \$pkgname not given."
216
217 # check needed global vars
218 [ -z "${BUILDDIR}" ] && die "install_directories() \$BUILDDIR not set."
219
220 [ ! -f ${BUILDDIR}/${pkgname}/.dirs ] && die "install_directories() .dirs not found"
221
222 # sets fieldseperator to "§" instead of " "
223 IFS=§
224
225 while read pathto posix user group
226 do
227 [ -z "${pathto}" ] && continue
228 mqueryfeature "verbose" && echo -e "\t>>> DIR: ${MROOT}${pathto}"
229
230 # monitors /etc/env.d -> env-rebuild
231 [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
232
233 # monitors /usr/share/info -> info-rebuild
234 [[ ${pathto} = /usr/share/info ]] && export MAGE_INFO_REBUILD=true
235
236 install -m "${posix}" -o "${user}" -g "${group}" -d "${MROOT}${pathto}"
237 done < ${BUILDDIR}/${pkgname}/.dirs
238
239 # very important: unsetting the '§' fieldseperator
240 IFS=$'\n'
241 }
242
243
244 ###################################################
245 # function install_files #
246 # install_files $PKGNAME #
247 ###################################################
248 install_files()
249 {
250
251 local pkgname="$1"
252 local pathto
253 local posix
254 local user
255 local group
256 local mtime
257 local md5sum
258
259 local retval
260 local counter
261 local filename
262 local dest_dirname
263 local dest_protected
264 local IFS
265
266 # sanity checks; abort if not given
267 [ -z "${pkgname}" ] && die "install_files() \$pkgname not given."
268
269 # check needed global vars
270 [ -z "${BUILDDIR}" ] && die "install_files() \$BUILDDIR not set."
271
272 [ ! -f ${BUILDDIR}/${pkgname}/.files ] && die "install_files() .files not found"
273
274 # delete old files
275 [ -f ${BUILDDIR}/${pkgname}/.files_fixed ] && rm ${BUILDDIR}/${pkgname}/.files_fixed
276
277 # sets fieldseperator to "§" instead of " "
278 IFS=§
279
280 while read pathto posix user group mtime md5sum
281 do
282 [ -z "${pathto}" ] && continue
283
284 # final destination dir of file ${pathto}
285 dest_dirname="$(dirname "${MROOT}${pathto}")"
286
287 ### small hotfix fix ###
288 [ ! -d "${dest_dirname}" ] && install -d "${dest_dirname}"
289
290 # check if the file is config_protected
291 # ${MROOT} will automatically added if set !!
292 is_config_protected "${pathto}"
293 retval="$?"
294
295 # 0 - not protected #
296 # 1 - error #
297 # 2 - protected #
298 # 3 - protected but masked #
299 # 4 - protected but ignored #
300
301 case ${retval} in
302 # file is not protected - (over)write it
303 0|3)
304 mqueryfeature "verbose" && echo -e "\t>>> FILE: ${MROOT}${pathto}"
305 install -m "${posix}" -o "${user}" -g "${group}" \
306 ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
307 "${MROOT}${pathto}"
308
309 # fix mtime and db
310 fix_descriptor ${pkgname}/.files \
311 "${pathto}" \
312 "${posix}" \
313 "${user}" \
314 "${group}" \
315 "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
316 "${MROOT}${pathto}")" \
317 "${md5sum}"
318 ;;
319
320 # file is protected, write backup file
321 2)
322 if mqueryfeature "verbose"
323 then
324 echo -en "${COLRED}"
325 echo -n "! prot "
326 echo -en "${COLDEFAULT}"
327 echo " === FILE: ${MROOT}${pathto}"
328 fi
329 filename="$(basename "${pathto}")"
330 counter=$(count_protected_files "${pathto}")
331 dest_protected="${dest_dirname}/._cfg${counter}_${filename}"
332 install -m "${posix}" -o "${user}" -g "${group}" \
333 ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
334 "${dest_protected}"
335
336 # fix mtime and db
337 fix_descriptor ${pkgname}/.files \
338 "${pathto}" \
339 "${posix}" \
340 "${user}" \
341 "${group}" \
342 "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
343 "${dest_protected}")" \
344 "${md5sum}"
345
346 # update global MAGE_PROTECT_COUNTER
347 (( MAGE_PROTECT_COUNTER++ ))
348 export MAGE_PROTECT_COUNTER
349 ;;
350
351 # file is protected but ignored, delete the update/do nothing
352 4)
353 if mqueryfeature "verbose"
354 then
355 echo -en "${COLRED}"
356 echo -n "! ignr "
357 echo -en "${COLDEFAULT}"
358 echo " === FILE: ${MROOT}${pathto}"
359 fi
360 # simply do nothing here - only fix mtime
361 fix_descriptor ${pkgname}/.files \
362 "${pathto}" \
363 "${posix}" \
364 "${user}" \
365 "${group}" \
366 "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
367 "${MROOT}${pathto}")" \
368 "${md5sum}"
369 ;;
370 esac
371 done < ${BUILDDIR}/${pkgname}/.files
372
373 # now copy the fixed file over the old one
374 [ -f ${BUILDDIR}/${pkgname}/.files_fixed ] && \
375 cp ${BUILDDIR}/${pkgname}/.files{_fixed,}
376
377 # very important: unsetting the '§' fieldseperator
378 IFS=$'\n'
379 }
380
381
382 ###################################################
383 # function install_symlinks #
384 # install_symlinks $PKGNAME #
385 ###################################################
386 install_symlinks()
387 {
388 local pkgname="$1"
389 local pathto
390 local posix
391 local link
392 local mtime
393 local IFS
394
395 # sanity checks; abort if not given
396 [ -z "${pkgname}" ] && die "install_symlinks() \$pkgname not given."
397
398 # check needed global vars
399 [ -z "${BUILDDIR}" ] && die "install_symlinks() \$BUILDDIR not set."
400
401 [ ! -f ${BUILDDIR}/${pkgname}/.symlinks ] && die "install_symlinks() .symlinks not found"
402
403 # delete old files
404 [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && rm ${BUILDDIR}/${pkgname}/.symlinks_fixed
405
406 # sets fieldseperator to "§" instead of " "
407 IFS=§
408
409 while read pathto posix link mtime
410 do
411 [ -z "${pathto}" ] && continue
412 mqueryfeature "verbose" && echo -e "\t>>> LINK: ${MROOT}${pathto}"
413
414 ln -snf "${link}" "${MROOT}${pathto}"
415
416 # # fix mtime and db
417 # fix_descriptor ${pkgname}/.symlinks \
418 # "${pathto}" \
419 # "${posix}" \
420 # "${link}" \
421 # "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
422 # "${MROOT}${pathto}")"
423
424 done < ${BUILDDIR}/${pkgname}/.symlinks
425
426 # # now copy the fixed file over the old one
427 # [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \
428 # cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}
429
430 # very important: unsetting the '§' fieldseperator
431 IFS=$'\n'
432 }
433
434
435 ###################################################
436 # function install_blockdevices #
437 # install_blockdevices $PKGNAME #
438 ###################################################
439 install_blockdevices()
440 {
441 local pkgname="$1"
442 local pathto
443 local posix
444 local user
445 local group
446 local IFS
447
448 # sanity checks; abort if not given
449 [ -z "${pkgname}" ] && die "install_blockdevices() \$pkgname not given."
450
451 # check needed global vars
452 [ -z "${BUILDDIR}" ] && die "install_blockdevices() \$BUILDDIR not set."
453
454 [ ! -f ${BUILDDIR}/${pkgname}/.pipes ] && die "install_blockdevices() .pipes not found"
455
456 # sets fieldseperator to "§" instead of " "
457 IFS=§
458
459 while read pathto posix major minor user group
460 do
461 [ -z "${pathto}" ] && continue
462 mqueryfeature "verbose" && echo -e "\t>>> PIPE: ${MROOT}${pathto}"
463
464 mknod -m "${posix}" "${MROOT}${pathto}"
465 # make it optional atm !!
466 if [[ ! -z ${user} ]] && [[ ! -z ${group} ]]
467 then
468 chown "${user}:${group}" "${MROOT}${pathto}" b "${major}" "${minor}"
469 fi
470 done < ${BUILDDIR}/${pkgname}/.pipes
471
472 # very important: unsetting the '§' fieldseperator
473 IFS=$'\n'
474 }
475
476
477 ###################################################
478 # function install_characterdevices #
479 # install_characterdevices $PKGNAME #
480 ###################################################
481 install_characterdevices()
482 {
483 local pkgname="$1"
484 local pathto
485 local posix
486 local major
487 local minor
488 local user
489 local group
490 local IFS
491
492 # sanity checks; abort if not given
493 [ -z "${pkgname}" ] && die "install_characterdevices() \$pkgname not given."
494
495 # check needed global vars
496 [ -z "${BUILDDIR}" ] && die "install_characterdevices() \$BUILDDIR not set."
497
498 [ ! -f ${BUILDDIR}/${pkgname}/.char ] && die "install_characterdevices() .char not found"
499
500 # sets fieldseperator to "§" instead of " "
501 IFS=§
502
503 while read pathto posix major minor user group
504 do
505 [ -z "${pathto}" ] && continue
506 mqueryfeature "verbose" && echo -e "\t>>> CHAR: ${MROOT}${pathto}"
507
508 mknod -m ${posix} "${MROOT}${pathto}" b "${major}" "${minor}"
509
510 # make it optional atm !!
511 if [[ ! -z ${user} ]] && [[ ! -z ${group} ]]
512 then
513 chown "${user}:${group}" "${MROOT}${pathto}"
514 fi
515 done < ${BUILDDIR}/${pkgname}/.char
516
517 # very important: unsetting the '§' fieldseperator
518 IFS=$'\n'
519 }
520
521 ###################################################
522 # function install_fifos #
523 # install_fifos $PKGNAME #
524 ###################################################
525 install_fifos()
526 {
527 local pkgname="$1"
528 local pathto
529 local posix
530 local user
531 local group
532 local IFS
533
534 # sanity checks; abort if not given
535 [ -z "${pkgname}" ] && die "install_fifos() \$pkgname not given."
536
537 # check needed global vars
538 [ -z "${BUILDDIR}" ] && die "install_fifos() \$BUILDDIR not set."
539
540 # make it optional atm !!
541 #[ ! -f ${BUILDDIR}/${pkgname}/.fifo ] && die "install_fifos() .fifo not found"
542 [ ! -f ${BUILDDIR}/${pkgname}/.fifo ] && return
543
544 # sets fieldseperator to "§" instead of " "
545 IFS=§
546
547 while read pathto posix user group
548 do
549 [ -z "${pathto}" ] && continue
550 mqueryfeature "verbose" && echo -e "\t>>> FIFO: ${MROOT}${pathto}"
551
552 mkfifo -m "${posix}" "${MROOT}${pathto}"
553 chown "${user}:${group}" "${MROOT}${pathto}"
554 done < ${BUILDDIR}/${pkgname}/.fifo
555
556 # very important: unsetting the '§' fieldseperator
557 IFS=$'\n'
558 }
559
560
561 ###################################################
562 # function build_doinstall #
563 # build_doinstall $PKGNAME #
564 # NOTE: this is an wrapper to install packages #
565 ###################################################
566 build_doinstall()
567 {
568 local pkgname="$1"
569
570 # sanity checks; abort if not given
571 [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."
572
573 # this is only a wrapper
574
575 # NOTE:
576 # !! we use § as field seperator !!
577 # doing so prevent us to get errors by filenames with spaces
578
579 # create a new mtime reference file
580 touch ${BUILDDIR}/${pkgname}/.mtime
581
582 install_directories ${pkgname} || die "install directories ${pkgname}"
583 install_files ${pkgname} || die "install files ${pkgname}"
584 install_symlinks ${pkgname} || die "install symlinks ${pkgname}"
585 install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"
586 install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"
587 install_fifos ${pkgname} || die "install fifos ${pkgname}"
588 }
589
590
591 ###################################################
592 # function install_database_entry #
593 # install_database_entry $PKGNAME $PKGTYPE #
594 # PKGTYPE can be "virtual", "sources" or nothing #
595 ###################################################
596 install_database_entry()
597 {
598 local pcat
599 local pname
600 local pver
601 local pbuild
602 local pkgtype
603 local pkgname
604 local magefile
605 local dbrecorddir
606 local provide
607 local i
608
609 # very basic getops
610 for i in $*
611 do
612 case $1 in
613 --pcat|-c) shift; pcat="$1" ;;
614 --pname|-n) shift; pname="$1" ;;
615 --pver|-v) shift; pver="$1" ;;
616 --pbuild|-b) shift; pbuild="$1" ;;
617 --pkgname|-a) shift; pkgname="$1" ;;
618 --pkgtype|-t) shift; pkgtype="$1" ;;
619 esac
620 shift
621 done
622
623 # sanity checks; abort if not given
624 [ -z "${pcat}" ] && die "install_database_entry() \$pcat not given."
625 [ -z "${pname}" ] && die "install_database_entry() \$pname not given."
626 [ -z "${pver}" ] && die "install_database_entry() \$pver not given."
627 [ -z "${pbuild}" ] && die "install_database_entry() \$pbuild not given."
628 [ -z "${pkgname}" ] && die "install_database_entry() \$pkgname not given."
629
630 # check needed global vars
631 [ -z "${MAGEDIR}" ] && die "install_database_entry() \$MAGEDIR not set."
632 [ -z "${INSTALLDB}" ] && die "install_database_entry() \$INSTALLDB not set."
633
634 # set needed vars
635 magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
636 dbrecorddir="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}"
637
638 # abort if mage file not exists
639 [ ! -f ${magefile} ] && die "install_database_entry() ${magefile} not exist."
640
641 # add package to database
642 install -d ${dbrecorddir}
643
644 # install mage-file to database
645 install -m 0644 -o root -g root ${magefile} ${dbrecorddir}
646
647 # create fake file descriptors
648 # used by virtual and source packages
649 for i in .dirs .symlinks .files .pipes .char .fifo
650 do
651 touch ${dbrecorddir}/${i}
652 done
653
654 # put the category to database
655 echo ${pcat} > ${dbrecorddir}/.categorie
656
657 # now install PKGTYPE specific files
658 case ${pkgtype} in
659 virtual) touch ${dbrecorddir}/.virtual ;;
660 sources) touch ${dbrecorddir}/.sources ;;
661 *)
662 # !move! .mtime to database (only mv modifies not the mtime!!)
663 mv ${BUILDDIR}/${pkgname}/.mtime ${dbrecorddir}/.mtime
664
665 # normal packages needs these files
666 local i
667 for i in .char .dirs .files .pipes .symlinks .fifo
668 do
669 # make .fifo optional atm
670 if [[ -f ${BUILDDIR}/${pkgname}/${i} ]]
671 then
672 install -m 0644 ${BUILDDIR}/${pkgname}/${i} ${dbrecorddir}/${i}
673 fi
674 done
675 ;;
676 esac
677
678 # last but not least register virtuals
679 provide="$(get_value_from_magefile PROVIDE ${magefile})"
680 if [ -n "${provide}" ]
681 then
682 for i in ${provide}
683 do
684 virtuals_add "${i}" "${pcat}/${pname}"
685 done
686 fi
687 }
688
689
690 ###################################################
691 # function remove_database_entry #
692 # remove_database_entry $PKGNAME $PKGTYPE #
693 # PKGTYPE can be "virtual", "sources" or nothing #
694 ###################################################
695 remove_database_entry()
696 {
697 local pcat
698 local pname
699 local pver
700 local pbuild
701 local magefile
702 local dbrecorddir
703 local provide
704 local i
705
706 # very basic getops
707 for i in $*
708 do
709 case $1 in
710 --pcat|-c) shift; pcat="$1" ;;
711 --pname|-n) shift; pname="$1" ;;
712 --pver|-v) shift; pver="$1" ;;
713 --pbuild|-b) shift; pbuild="$1" ;;
714 esac
715 shift
716 done
717
718 # sanity checks; abort if not given
719 [ -z "${pcat}" ] && die "remove_database_entry() \$pcat not given."
720 [ -z "${pname}" ] && die "remove_database_entry() \$pname not given."
721 [ -z "${pver}" ] && die "remove_database_entry() \$pver not given."
722 [ -z "${pbuild}" ] && die "remove_database_entry() \$pbuild not given."
723
724 # check needed global vars
725 [ -z "${INSTALLDB}" ] && die "remove_database_entry() \$INSTALLDB not set."
726
727 # set needed vars
728 magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
729 dbrecorddir="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}"
730
731 # abort if mage file not exists
732 [ ! -f ${magefile} ] && die "remove_database_entry() ${magefile} not exist."
733
734 # remove virtuals only if no other exist
735 if [[ $(count_installed_pkgs --pcat ${pcat} --pname ${pname}) -le 1 ]]
736 then
737 # first unregister virtuals
738 provide="$(get_value_from_magefile PROVIDE ${magefile})"
739 if [ -n "${provide}" ]
740 then
741 for i in ${provide}
742 do
743 virtuals_del "${i}" "${pcat}/${pname}"
744 done
745 fi
746 fi
747
748 # removes database entry
749 if [ -d ${dbrecorddir} ]
750 then
751 rm -rf ${dbrecorddir}
752 fi
753 }
754
755 # get the number of installed packages
756 count_installed_pkgs()
757 {
758 local pcat
759 local pname
760 local pkg
761 local i
762
763 # very basic getops
764 for i in $*
765 do
766 case $1 in
767 --pcat|-c) shift; pcat="$1" ;;
768 --pname|-n) shift; pname="$1" ;;
769 esac
770 shift
771 done
772
773 # sanity checks; abort if not given
774 [ -z "${pcat}" ] && die "pkg_count() \$pcat not given."
775 [ -z "${pname}" ] && die "pkg_count() \$pname not given."
776
777 declare -i i=0
778 for pkg in $(get_uninstall_candidates --pcat ${pcat} --pname ${pname})
779 do
780 (( i++ ))
781 #echo "$i ${pkg}"
782 done
783
784 # return the value
785 echo "${i}"
786 }
787
788
789 ###################################################
790 # function compare_mtime #
791 # compare_mtime $pcat/$PKGNAME /path/to/file #
792 # #
793 # returns: #
794 # 0=delete me #
795 # 1=keep me #
796 # #
797 # compares mtime of given files in packages #
798 ###################################################
799 compare_mtime()
800 {
801 local pfull="$1"
802 local pathto="$2"
803 local mtime
804 local pcat
805 local x
806
807 mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"
808
809 # if $pathto is a symlink than compare linked binary
810 if [ -L "${MROOT}${pathto}" ]
811 then
812 # readlink -f resolves full path of linked file
813 x="$(readlink -f "${MROOT}${pathto}")"
814
815 # abort if target does not exists
816 # we keep safe here, theoretically the link can removed
817 [ ! -e "${x}" ] && return 1
818
819 x=$(stat -c %Y "${x}")
820 else
821 x=$(stat -c %Y "${MROOT}${pathto}")
822 fi
823
824 [[ ${mtime} = ${x} ]] && return 0
825
826 # echo "keep me : ${pathto}"
827 return 1
828 }
829
830
831 ###################################################
832 # function remove_symlinks #
833 # remove_symlinks $PKGNAME #
834 ###################################################
835 remove_symlinks()
836 {
837 local pathto
838 local posix
839 local link
840 local mtime
841 local IFS
842 local retval
843 local pcat
844 local pname
845 local pver
846 local pbuild
847 local i
848 local pfull
849
850 IFS=$'\n'
851
852 # very basic getops
853 for i in $*
854 do
855 case $1 in
856 --pcat|-c) shift; pcat="$1" ;;
857 --pname|-n) shift; pname="$1" ;;
858 --pver|-v) shift; pver="$1" ;;
859 --pbuild|-b) shift; pbuild="$1" ;;
860 esac
861 shift
862 done
863
864 # sanity checks; abort if not given
865 [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
866 [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
867 [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
868 [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
869 pfull="${pcat}/${pname}-${pver}-${pbuild}"
870
871 # check needed global vars
872 [ -z "${BUILDDIR}" ] && die "remove_symlinks() \$BUILDDIR not set."
873
874 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.symlinks ] && die "remove_symlinks() .symlinks not found"
875
876 # sets fieldseperator to "§" instead of " "
877 IFS=§
878
879 while read pathto posix link mtime
880 do
881 [ -z "${pathto}" ] && continue
882 if [ ! -L "${MROOT}${pathto}" ]
883 then
884 mqueryfeature "verbose" && \
885 echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"
886 continue
887 fi
888
889 # *no* ${MROOT}, will be set internal
890 compare_mtime "${pfull}" "${pathto}"
891 retval=$?
892 # 0=delete me #
893 # 1=keep me #
894 case ${retval} in
895 0)
896 mqueryfeature "verbose" && echo -e "\t<<< LINK: ${MROOT}${pathto}"
897 rm "${MROOT}${pathto}"
898 ;;
899
900 1)
901 mqueryfeature "verbose" && \
902 echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"
903 ;;
904 esac
905 done < ${MROOT}${INSTALLDB}/${pfull}/.symlinks
906
907 # very important: unsetting the '§' fieldseperator
908 IFS=$'\n'
909 }
910
911
912 ###################################################
913 # function remove_files #
914 # remove_files $PKGNAME #
915 ###################################################
916 remove_files()
917 {
918 local pathto
919 local posix
920 local user
921 local group
922 local mtime
923 local md5sum
924 local IFS
925 local retval
926 local pcat
927 local pname
928 local pver
929 local pbuild
930 local i
931 local pfull
932
933 IFS=$'\n'
934
935 # very basic getops
936 for i in $*
937 do
938 case $1 in
939 --pcat|-c) shift; pcat="$1" ;;
940 --pname|-n) shift; pname="$1" ;;
941 --pver|-v) shift; pver="$1" ;;
942 --pbuild|-b) shift; pbuild="$1" ;;
943 esac
944 shift
945 done
946
947 # sanity checks; abort if not given
948 [ -z "${pcat}" ] && die "remove_files() \$pcat not given."
949 [ -z "${pname}" ] && die "remove_files() \$pname not given."
950 [ -z "${pver}" ] && die "remove_files() \$pver not given."
951 [ -z "${pbuild}" ] && die "remove_files() \$pbuild not given."
952 pfull="${pcat}/${pname}-${pver}-${pbuild}"
953
954 # check needed global vars
955 [ -z "${BUILDDIR}" ] && die "remove_files() \$BUILDDIR not set."
956
957 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.files ] && die "remove_files() .files not found"
958
959 # sets fieldseperator to "§" instead of " "
960 IFS=§
961
962 while read pathto posix user group mtime md5sum
963 do
964 [ -z "${pathto}" ] && continue
965
966 if [ ! -e "${MROOT}${pathto}" ]
967 then
968 mqueryfeature "verbose" && \
969 echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"
970 continue
971 fi
972
973 # *no* ${MROOT}, will be set internal
974 compare_mtime "${pfull}" "${pathto}"
975 retval=$?
976 # 0=delete me #
977 # 1=keep me #
978 case ${retval} in
979 0)
980 # check if the file is config_protected
981 # ${MROOT} will automatically added if set !!
982 is_config_protected "${pathto}"
983 retval="$?"
984
985 # 0 - not protected #
986 # 1 - error #
987 # 2 - protected #
988 # 3 - protected but masked #
989 # 4 - protected but ignored #
990
991 case ${retval} in
992 # file is not protected - delete it
993 0|3)
994 mqueryfeature "verbose" && echo -e "\t<<< FILE: ${MROOT}${pathto}"
995 rm "${MROOT}${pathto}"
996 ;;
997
998 # file is protected, do not delete
999 2)
1000 if mqueryfeature "verbose"
1001 then
1002 echo -en "${COLRED}"
1003 echo -n "! prot "
1004 echo -en "${COLDEFAULT}"
1005 echo " === FILE: ${MROOT}${pathto}"
1006 fi
1007 ;;
1008
1009 # file is protected but ignored, delete the update/do nothing
1010 4)
1011 if mqueryfeature "verbose"
1012 then
1013 echo -en "${COLRED}"
1014 echo -n "! ignr "
1015 echo -en "${COLDEFAULT}"
1016 echo " === FILE: ${MROOT}${pathto}"
1017 fi
1018 # simply do nothing here
1019 ;;
1020 esac
1021 ;;
1022 1)
1023 mqueryfeature "verbose" && \
1024 echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"
1025 ;;
1026 esac
1027 done < ${MROOT}${INSTALLDB}/${pfull}/.files
1028
1029 # very important: unsetting the '§' fieldseperator
1030 IFS=$'\n'
1031 }
1032
1033
1034 ###################################################
1035 # function remove_blockdevices #
1036 # remove_blockdevices $PKGNAME #
1037 ###################################################
1038 remove_blockdevices()
1039 {
1040 local pathto
1041 local posix
1042 local user
1043 local group
1044 local IFS
1045 local pcat
1046 local pname
1047 local pver
1048 local pbuild
1049 local i
1050 local pfull
1051
1052 IFS=$'\n'
1053
1054 # very basic getops
1055 for i in $*
1056 do
1057 case $1 in
1058 --pcat|-c) shift; pcat="$1" ;;
1059 --pname|-n) shift; pname="$1" ;;
1060 --pver|-v) shift; pver="$1" ;;
1061 --pbuild|-b) shift; pbuild="$1" ;;
1062 esac
1063 shift
1064 done
1065
1066 # sanity checks; abort if not given
1067 [ -z "${pcat}" ] && die "remove_blockdevices() \$pcat not given."
1068 [ -z "${pname}" ] && die "remove_blockdevices() \$pname not given."
1069 [ -z "${pver}" ] && die "remove_blockdevices() \$pver not given."
1070 [ -z "${pbuild}" ] && die "remove_blockdevices() \$pbuild not given."
1071 pfull="${pcat}/${pname}-${pver}-${pbuild}"
1072
1073 # check needed global vars
1074 [ -z "${BUILDDIR}" ] && die "remove_blockdevices() \$BUILDDIR not set."
1075
1076 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.pipes ] && die "remove_blockdevices() .pipes not found"
1077
1078 # sets fieldseperator to "§" instead of " "
1079 IFS=§
1080
1081 while read pathto posix user group
1082 do
1083 [ -z "${pathto}" ] && continue
1084
1085 mqueryfeature "verbose" && echo -e "\t<<< PIPE: ${MROOT}${pathto}"
1086 rm "${MROOT}${pathto}"
1087 done < ${MROOT}${INSTALLDB}/${pfull}/.pipes
1088
1089 # very important: unsetting the '§' fieldseperator
1090 IFS=$'\n'
1091 }
1092
1093
1094 ###################################################
1095 # function remove_characterdevices #
1096 # remove_characterdevices $PKGNAME #
1097 ###################################################
1098 remove_characterdevices()
1099 {
1100 local pathto
1101 local posix
1102 local user
1103 local group
1104 local IFS
1105 local pcat
1106 local pname
1107 local pver
1108 local pbuild
1109 local i
1110 local pfull
1111
1112 IFS=$'\n'
1113
1114 # very basic getops
1115 for i in $*
1116 do
1117 case $1 in
1118 --pcat|-c) shift; pcat="$1" ;;
1119 --pname|-n) shift; pname="$1" ;;
1120 --pver|-v) shift; pver="$1" ;;
1121 --pbuild|-b) shift; pbuild="$1" ;;
1122 esac
1123 shift
1124 done
1125
1126 # sanity checks; abort if not given
1127 [ -z "${pcat}" ] && die "remove_characterdevices() \$pcat not given."
1128 [ -z "${pname}" ] && die "remove_characterdevices() \$pname not given."
1129 [ -z "${pver}" ] && die "remove_characterdevices() \$pver not given."
1130 [ -z "${pbuild}" ] && die "remove_characterdevices() \$pbuild not given."
1131 pfull="${pcat}/${pname}-${pver}-${pbuild}"
1132
1133 # check needed global vars
1134 [ -z "${BUILDDIR}" ] && die "remove_characterdevices() \$BUILDDIR not set."
1135
1136 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_characterdevices() .char not found"
1137
1138 # sets fieldseperator to "§" instead of " "
1139 IFS=§
1140
1141 while read pathto posix user group
1142 do
1143 [ -z "${pathto}" ] && continue
1144
1145 mqueryfeature "verbose" && echo -e "\t<<< CHAR: ${MROOT}${pathto}"
1146 rm "${MROOT}${pathto}"
1147 done < ${MROOT}${INSTALLDB}/${pfull}/.char
1148
1149 # very important: unsetting the '§' fieldseperator
1150 IFS=$'\n'
1151 }
1152
1153
1154 ###################################################
1155 # function remove_fifos #
1156 # remove_fifos $PKGNAME #
1157 ###################################################
1158 remove_fifos()
1159 {
1160 local pathto
1161 local posix
1162 local user
1163 local group
1164 local IFS
1165 local pcat
1166 local pname
1167 local pver
1168 local pbuild
1169 local i
1170 local pfull
1171
1172 IFS=$'\n'
1173
1174 # very basic getops
1175 for i in $*
1176 do
1177 case $1 in
1178 --pcat|-c) shift; pcat="$1" ;;
1179 --pname|-n) shift; pname="$1" ;;
1180 --pver|-v) shift; pver="$1" ;;
1181 --pbuild|-b) shift; pbuild="$1" ;;
1182 esac
1183 shift
1184 done
1185
1186 # sanity checks; abort if not given
1187 [ -z "${pcat}" ] && die "remove_fifos() \$pcat not given."
1188 [ -z "${pname}" ] && die "remove_fifos() \$pname not given."
1189 [ -z "${pver}" ] && die "remove_fifos() \$pver not given."
1190 [ -z "${pbuild}" ] && die "remove_fifos() \$pbuild not given."
1191 pfull="${pcat}/${pname}-${pver}-${pbuild}"
1192
1193 # check needed global vars
1194 [ -z "${BUILDDIR}" ] && die "remove_fifos() \$BUILDDIR not set."
1195
1196 # make it optional atm !!
1197 #[ ! -f ${MROOT}${INSTALLDB}/${pfull}/.fifo ] && die "remove_fifos() .fifo not found"
1198 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.fifo ] && return
1199
1200 # sets fieldseperator to "§" instead of " "
1201 IFS=§
1202
1203 while read pathto posix user group
1204 do
1205 [ -z "${pathto}" ] && continue
1206
1207 mqueryfeature "verbose" && echo -e "\t<<< FIFO: ${MROOT}${pathto}"
1208 rm "${MROOT}${pathto}"
1209 done < ${MROOT}${INSTALLDB}/${pfull}/.fifo
1210
1211 # very important: unsetting the '§' fieldseperator
1212 IFS=$'\n'
1213 }
1214
1215
1216 ###################################################
1217 # function remove_direcories #
1218 # remove_direcories $PKGNAME #
1219 ###################################################
1220 remove_directories()
1221 {
1222 local pathto
1223 local posix
1224 local IFS
1225 local pcat
1226 local pname
1227 local pver
1228 local pbuild
1229 local i
1230 local pfull
1231
1232 IFS=$'\n'
1233
1234 # very basic getops
1235 for i in $*
1236 do
1237 case $1 in
1238 --pcat|-c) shift; pcat="$1" ;;
1239 --pname|-n) shift; pname="$1" ;;
1240 --pver|-v) shift; pver="$1" ;;
1241 --pbuild|-b) shift; pbuild="$1" ;;
1242 esac
1243 shift
1244 done
1245
1246 # sanity checks; abort if not given
1247 [ -z "${pcat}" ] && die "remove_directories() \$pcat not given."
1248 [ -z "${pname}" ] && die "remove_directories() \$pname not given."
1249 [ -z "${pver}" ] && die "remove_directories() \$pver not given."
1250 [ -z "${pbuild}" ] && die "remove_directories() \$pbuild not given."
1251 pfull="${pcat}/${pname}-${pver}-${pbuild}"
1252
1253 # check needed global vars
1254 [ -z "${BUILDDIR}" ] && die "remove_directories() \$BUILDDIR not set."
1255
1256 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_directories() .dirs not found"
1257
1258 # sets fieldseperator to "§" instead of " "
1259 IFS=§
1260
1261 # reversed order is mandatory !
1262 tac ${MROOT}${INSTALLDB}/${pfull}/.dirs | while read pathto posix
1263 do
1264 [ -z "${pathto}" ] && continue
1265
1266 if [ ! -d "${MROOT}${pathto}" ]
1267 then
1268 mqueryfeature "verbose" && \
1269 echo -e "${COLRED}! exist${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1270 continue
1271 fi
1272
1273 # exclude .keep directories
1274 if [ -f "${MROOT}${pathto}/.keep" ]
1275 then
1276 mqueryfeature "verbose" && \
1277 echo -e "${COLRED}! .keep${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1278 continue
1279 fi
1280
1281 # monitors /etc/env.d -> env-rebuild
1282 [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
1283
1284 # monitors /usr/share/info -> info-rebuild
1285 [[ ${pathto} = /usr/share/info ]] && export MAGE_INFO_REBUILD=true
1286
1287 if rmdir "${MROOT}${pathto}" &> /dev/null
1288 then
1289 mqueryfeature "verbose" && echo -e "\t<<< DIR: ${MROOT}${pathto}"
1290 else
1291 mqueryfeature "verbose" && \
1292 echo -e "${COLRED}! empty${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1293 fi
1294 done
1295
1296 # very important: unsetting the '§' fieldseperator
1297 IFS=$'\n'
1298 }
1299
1300
1301 ###################################################
1302 # function build_douninstall #
1303 # build_douninstall $PKGNAME #
1304 # NOTE: this is an wrapper to remove packages #
1305 ###################################################
1306 build_douninstall()
1307 {
1308 local pcat
1309 local pname
1310 local pver
1311 local pbuild
1312 local i
1313
1314 # very basic getops
1315 for i in $*
1316 do
1317 case $1 in
1318 --pcat|-c) shift; pcat="$1" ;;
1319 --pname|-n) shift; pname="$1" ;;
1320 --pver|-v) shift; pver="$1" ;;
1321 --pbuild|-b) shift; pbuild="$1" ;;
1322 esac
1323 shift
1324 done
1325
1326 # sanity checks; abort if not given
1327 [ -z "${pcat}" ] && die "build_douninstall() \$pcat not given."
1328 [ -z "${pname}" ] && die "build_douninstall() \$pname not given."
1329 [ -z "${pver}" ] && die "build_douninstall() \$pver not given."
1330 [ -z "${pbuild}" ] && die "build_douninstall() \$pbuild not given."
1331
1332 # this is only a wrapper
1333
1334 # NOTE:
1335 # !! we use § as field seperator !!
1336 # doing so prevent us to get errors by filenames with spaces
1337
1338 for i in symlinks files blockdevices characterdevices directories fifos
1339 do
1340 remove_${i} \
1341 --pcat "${pcat}" \
1342 --pname "${pname}" \
1343 --pver "${pver}" \
1344 --pbuild "${pbuild}" \
1345 || die "remove ${i} ${pcat}/${pname}-${pver}-${pbuild}"
1346 done
1347 }
1348
1349 # convertmirrors [uri]
1350 convertmirrors()
1351 {
1352 local uri="$1"
1353 local scheme
1354 local mirror
1355 local mirrors
1356 local addon
1357 local real_uri
1358 local output
1359
1360 # needs
1361 [[ -z ${MIRRORS} ]] && die "convertmirrors(): no mirrors defined!"
1362 [[ -z ${SOURCEFORGE_MIRRORS} ]] && die "convertmirrors(): no sourceforge mirrors defined!"
1363 [[ -z ${GNU_MIRRORS} ]] && die "convertmirrors(): no gnu mirrors defined!"
1364 [[ -z ${GNOME_MIRRORS} ]] && die "convertmirrors(): no gnome mirrors defined!"
1365 [[ -z ${KDE_MIRRORS} ]] && die "convertmirrors(): no kde mirrors defined!"
1366
1367 # check known uri schemes
1368 case ${uri} in
1369 http://*|https://*|ftp://*|ftps://*) mirrors="" ;;
1370 mirror://*) mirrors="${MIRRORS}"; scheme="mirror://"; addon="/sources" ;;
1371 package://*) mirrors="${MIRRORS}"; scheme="package://"; addon="/${PACKAGES_SERVER_PATH}" ;;
1372 gnu://*) mirrors="${GNU_MIRRORS}"; scheme="gnu://" ;;
1373 sourceforge://*) mirrors="${SOURCEFORGE_MIRRORS}"; scheme="sourceforge://" ;;
1374 gnome://*) mirrors="${GNOME_MIRRORS}"; scheme="gnome://" ;;
1375 kde://*) mirrors="${KDE_MIRRORS}"; scheme="kde://" ;;
1376 *) die "convertmirror(): unsupported uri scheme in '${uri}'!" ;;
1377 esac
1378
1379 if [[ ! -z ${mirrors} ]]
1380 then
1381 for mirror in ${mirrors}
1382 do
1383 # add a whitespace to the output
1384 [[ -z ${output} ]] || output+=" "
1385 output+="${mirror}${addon}/${uri/${scheme}/}"
1386 done
1387 else
1388 output="${uri}"
1389 fi
1390
1391 echo "${output}"
1392 }
1393
1394 mdownload()
1395 {
1396 local i
1397 local uri
1398 local real_uris
1399 local mirror
1400 local outputfile
1401 local outputdir
1402 local retval
1403 local wget_opts
1404
1405 # very basic getops
1406 for i in $*
1407 do
1408 case $1 in
1409 --uri|-u) shift; uri="$1" ;;
1410 --dir|-d) shift; outputdir="$1" ;;
1411 esac
1412 shift
1413 done
1414
1415 # sanity checks; abort if not given
1416 [[ -z ${uri} ]] && die "mdownload(): no uri given!"
1417 [[ -z ${outputdir} ]] && die "mdownload(): no dir given!"
1418
1419 # convert mirrored uris to the real ones
1420 real_uris="$(convertmirrors ${uri})"
1421
1422 # verbose or not
1423 mqueryfeature "!verbose" && wget_opts+=" --quiet"
1424
1425 # filter wget options if busybox was found
1426 wget_opts+=" $(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1427
1428 # create outputdir
1429 [[ ! -d ${outputdir} ]] && install -d "${outputdir}"
1430
1431 for mirror in ${real_uris}
1432 do
1433 # get the name of the output file
1434 outputfile="${mirror##*/}"
1435
1436 wget ${wget_opts} --output-document="${outputdir}/${outputfile}" "${mirror}"
1437 retval="$?"
1438 if [[ ${retval} = 0 ]]
1439 then
1440 break
1441 else
1442 continue
1443 fi
1444 done
1445
1446 # return wget retval
1447 return "${retval}"
1448 }
1449
1450 # fetch_packages /path/to/mage/file1 /path/to/mage/file2
1451 fetch_packages()
1452 {
1453 local i
1454 local list="$@"
1455 local pkg
1456 local mirr
1457 local magefile
1458 local md5file
1459 local opt
1460 local count_current
1461 local count_total
1462 local wget_opts
1463
1464 [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your ${MAGERC}."
1465
1466 # filter wget command if busybox was found
1467 wget_opts="$(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1468
1469 # get count of total packages
1470 declare -i count_current=0
1471 declare -i count_total=0
1472
1473 for i in ${list}; do (( count_total++ )); done
1474
1475 for magefile in ${list}
1476 do
1477 pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
1478 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
1479
1480 (( count_current++ ))
1481 xtitle "[ (${count_current}/${count_total}) Fetching ${pkg} ]"
1482
1483 # abort on virtual pkg
1484 if [[ ${pkgtype} = virtual ]]
1485 then
1486 echo -ne " ${COLBLUE}---${COLDEFAULT}"
1487 echo " !fetch virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
1488 continue
1489 fi
1490
1491 # abort on sources pkg
1492 if [[ ${pkgtype} = sources ]]
1493 then
1494 echo -ne " ${COLBLUE}---${COLDEFAULT}"
1495 echo " !fetch sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
1496 continue
1497 fi
1498
1499 # abort if already exist
1500 if [ -f ${PKGDIR}/${pkg} ]
1501 then
1502 echo -ne " ${COLBLUE}***${COLDEFAULT}"
1503 echo " fetch complete (${count_current}/${count_total}): ${pkg} ... "
1504 continue
1505 fi
1506
1507 echo -ne " ${COLBLUE}***${COLDEFAULT}"
1508 echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "
1509 mdownload --uri "package://${pkg}" --dir "${PKGDIR}" || die "Could not download ${pkg}"
1510 if [ ! -f ${PKGDIR}/${pkg} ]
1511 then
1512 die "Package '${pkg}' after download not found in '${PKGDIR}'"
1513 fi
1514 done
1515
1516 # add a crlf for a better view
1517 if [ ${count_total} -gt 1 ]; then echo; fi
1518 }
1519
1520 syncmage()
1521 {
1522 if [ -z "${RSYNC}" ]
1523 then
1524 die "You have no rsync-mirrors defined. Please edit your ${MAGERC}."
1525 fi
1526
1527 local i
1528 for i in ${RSYNC}
1529 do
1530 rsync ${RSYNC_FETCH_OPTIONS} ${i} ${MAGEDIR}
1531 if [[ $? = 0 ]]
1532 then
1533 break
1534 else
1535 continue
1536 fi
1537 done
1538
1539 # clean up backup files (foo~)
1540 find ${MAGEDIR} -name \*~ -exec rm '{}' ';'
1541
1542 # check if a newer mage version is available
1543 is_newer_mage_version_available
1544 }
1545
1546 syncmage_tarball()
1547 {
1548 local latest_tarball
1549 local latest_md5
1550 local temp="$(mktemp -d)"
1551 local mirr mymirr
1552 local opt
1553 local tar_opts
1554 local wget_opts
1555
1556 # try to get the md5 marked as latest on the server
1557 latest_md5="mage-latest.md5"
1558
1559 # try to get the tarball marked as latest on the server
1560 latest_tarball="mage-latest.tar.bz2"
1561
1562 # filter wget command if busybox was found
1563 wget_opts="$(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1564
1565 for mirr in ${MIRRORS}
1566 do
1567 # path without distribution
1568 mymirr="${mirr%/*}"
1569
1570 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1571 echo "fetching latest md5 from ${mymirr} ..."
1572 mqueryfeature "!verbose" && opt="--quiet"
1573 wget \
1574 ${wget_opts} \
1575 --directory-prefix=${temp} \
1576 ${opt} ${mymirr}/rsync/tarballs/${latest_md5}
1577
1578 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1579 echo "fetching latest tarball from ${mymirr} ..."
1580 wget \
1581 ${wget_opts} \
1582 --directory-prefix=${temp} \
1583 ${opt} ${mymirr}/rsync/tarballs/${latest_tarball}
1584 if [[ $? = 0 ]]
1585 then
1586 break
1587 else
1588 continue
1589 fi
1590 done
1591
1592 if [[ -f ${temp}/${latest_tarball} ]]
1593 then
1594 # check md5
1595 if [[ ! -f ${temp}/${latest_md5} ]]
1596 then
1597 die "md5 is missing ... aborting"
1598 else
1599 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1600 echo -n "checking md5sum... "
1601 mchecksum --rundir "${temp}" --file "${latest_md5}" --method md5 || die "md5 for ${latest_tarball} failed"
1602 fi
1603
1604 if [[ -d ${MAGEDIR} ]]
1605 then
1606 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1607 echo "cleaning old mage-tree ${MAGEDIR}..."
1608 # honor mountpoints and empty dirs
1609 if mountpoint -q ${MAGEDIR}
1610 then
1611 if ! mcheckemptydir ${MAGEDIR}
1612 then
1613 find ${MAGEDIR} -mindepth 1 -maxdepth 1 | xarg --no-run-if-empty rm -r
1614 fi
1615 else
1616 rm -rf ${MAGEDIR}
1617 fi
1618 fi
1619
1620 if need_busybox_support tar
1621 then
1622 tar_opts="xjf"
1623 else
1624 tar_opts="xjmf"
1625 fi
1626
1627 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1628 echo "updating mage-tree from tarball ..."
1629 # unpack in dirname of MAGEDIR, as the tarball has already the mage
1630 tar ${tar_opts} ${temp}/${latest_tarball} -C ${MAGEDIR%/*} || die "Unpacking tarball"
1631
1632 if [[ -d ${temp} ]]
1633 then
1634 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1635 echo "cleaning temp-files ..."
1636 rm -rf ${temp}
1637 fi
1638
1639 # check if a newer mage version is available
1640 is_newer_mage_version_available
1641 else
1642 die "Could not fetch the latest tarball ... aborting"
1643 fi
1644 }
1645
1646 cleanpkg()
1647 {
1648 if [ -d "${PKGDIR}" ]
1649 then
1650 echo -n "Removing downloaded packages... "
1651 rm -rf ${PKGDIR}/*
1652 echo "done."
1653 fi
1654 }
1655
1656 xtitle()
1657 {
1658 if [[ ${TERM} = xterm ]]
1659 then
1660 echo -ne "\033]0;Mage: $1\007"
1661 fi
1662 return 0
1663 }
1664
1665
1666 xtitleclean()
1667 {
1668 if [[ ${TERM} = xterm ]]
1669 then
1670 echo -ne "\033]0;\007"
1671 fi
1672 return 0
1673 }
1674
1675
1676 # unused?
1677 #
1678 # # cuts full pathnames or versionized names down to basename
1679 # choppkgname()
1680 # {
1681 # #we want this only if full name was used
1682 # if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1683 # then
1684 # #cuts ARCH and PBUILD
1685 # #ARCH comes from ${MAGERC}
1686 # MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}$(print_distrotag)-r*.::g")
1687 #
1688 # #cuts version number
1689 # MAGENAME=$(basename ${MAGENAME%-*} .mage)
1690 # fi
1691 # }
1692
1693
1694 # get_categorie $PNAME, returns CATEGORIE
1695 # $1=pname
1696 # ret 0=ok, 1=not_found
1697 pname2pcat()
1698 {
1699 local pname="$1"
1700 local repo="$2"
1701 local pcat
1702 local categorie
1703
1704 for pcat in ${MAGEDIR}/*
1705 do
1706 if [ -d ${pcat}/${pname} ]
1707 then
1708 categorie=$(basename ${pcat})
1709 fi
1710 done
1711
1712 echo "${categorie}"
1713 }
1714
1715 # check_stable_package /path/to/foo.mage
1716 # returns 0=stable 1=unstable
1717 check_stable_package()
1718 {
1719 # first check if this magefile is not blacklisted
1720 blacklisted "$1" || return 1
1721
1722 local STATE
1723 STATE="$(get_value_from_magefile STATE "$1")"
1724
1725 # state testing
1726 if [[ ${USE_TESTING} = true ]] || [[ ${MAGE_DISTRIBUTION} = testing ]]
1727 then
1728 case ${STATE} in
1729 testing|stable) return 0 ;;
1730 *) return 1 ;;
1731 esac
1732 fi
1733
1734 # state unstable
1735 if [[ ${USE_UNSTABLE} = true ]] || [[ ${MAGE_DISTRIBUTION} = unstable ]]
1736 then
1737 case ${STATE} in
1738 unstable|testing|stable) return 0 ;;
1739 *) return 1 ;;
1740 esac
1741 fi
1742
1743 # no use_state given = stable
1744 case ${STATE} in
1745 stable) return 0 ;;
1746 *) return 1 ;;
1747 esac
1748 }
1749
1750
1751 # get_highest_magefile ${PCAT} ${PNAME}
1752 # fake at moment returns only stable pkgs (must set to be one)
1753 # return $HIGHEST_MAGEFILE
1754 get_highest_magefile()
1755 {
1756 local HIGHEST_MAGEFILE
1757 local PCAT="$1"
1758 local PNAME="$2"
1759 local magefile
1760
1761 # do not list the content of a directory, only the name (-d)
1762 for magefile in $(ls --format=single-column -v -d ${MAGEDIR}/${PCAT}/${PNAME}/* 2> /dev/null)
1763 do
1764 [[ -z ${magefile} ]] && continue
1765 # we exclude subdirs (for stuff like a md5sum dir)
1766 [[ -d ${magefile} ]] && continue
1767 if check_stable_package ${magefile}
1768 then
1769 HIGHEST_MAGEFILE=${magefile}
1770 #for debug only
1771 mqueryfeature "debug" && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1772 fi
1773 done
1774
1775 echo "${HIGHEST_MAGEFILE}"
1776 return 0
1777 }
1778
1779
1780 ###################################################
1781 # function is_config_protected #
1782 # is_config_protected /path/to/file #
1783 # #
1784 # returns: #
1785 # 0 - not protected #
1786 # 1 - error #
1787 # 2 - protected #
1788 # 3 - protected but masked #
1789 # 4 - protected but ignored #
1790 # #
1791 ###################################################
1792 is_config_protected()
1793 {
1794 local EXPFILE
1795 local TEST
1796 local PROTECTED
1797 local IFS
1798 local i
1799 local x
1800
1801 EXPFILE="${MROOT}$1"
1802
1803 # file does not exist; it can be written
1804 [[ ! -e ${EXPFILE} ]] && return 0
1805
1806 # to be safe; it may be '§'
1807 IFS=' '
1808
1809 # check if config protected
1810 for i in ${CONFIG_PROTECT}
1811 do
1812 # only replace $i in the beginning of the variable
1813 TEST="${EXPFILE/#${MROOT}${i}/Protected}"
1814 if [[ ${TEST} != ${EXPFILE} ]]
1815 then
1816 # file is config proteced
1817 PROTECTED=TRUE
1818
1819 # check if not masked
1820 for x in ${CONFIG_PROTECT_MASK}
1821 do
1822 TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"
1823 if [[ ${TEST} != ${EXPFILE} ]]
1824 then
1825 PROTECTED=MASKED
1826 fi
1827 done
1828
1829 # check if not ignored
1830 for x in ${CONFIG_PROTECT_IGNORE}
1831 do
1832 TEST="${EXPFILE/#${MROOT}${x}/Protect_Ignored}"
1833 if [[ ${TEST} != ${EXPFILE} ]]
1834 then
1835 PROTECTED=IGNORED
1836 fi
1837 done
1838 fi
1839 done
1840
1841 unset IFS
1842
1843 case ${PROTECTED} in
1844 TRUE)
1845 #echo "I'm protected"
1846 return 2
1847 ;;
1848 MASKED)
1849 #echo "I'm protected, but masked - delete me"
1850 return 3
1851 ;;
1852 IGNORED)
1853 #echo "I'm protected, but ignored - keep me, del update"
1854 return 4
1855 ;;
1856 *)
1857 #echo "delete me"
1858 return 0
1859 ;;
1860 esac
1861 }
1862
1863
1864 ###################################################
1865 # function count_protected_files #
1866 # count_protected_files /path/to/file #
1867 # #
1868 # note: prints number of protected files #
1869 # exp: 0012 #
1870 ###################################################
1871 count_protected_files()
1872 {
1873 local file="$1"
1874 local dirname="${file%/*}"
1875 local filename="${file##*/}"
1876 local count
1877 local output
1878 local i
1879
1880 declare -i count=0
1881
1882 # check if there are already protected files
1883 for oldpretected in $(find ${dirname} -iname "._cfg????_${filename}" |
1884 sed -e "s:\(^.*/\)\(._cfg*_\)\(/.*$\):\1\2\3\%\2\%\3:" |
1885 sort -t'%' -k3 -k2 | cut -f1 -d'%')
1886 do
1887 count=$(echo ${oldpretected} | cut -d_ -f2 | sed -e "s:cfg::")
1888 done
1889 (( count ++ ))
1890
1891 # fill output up with zeros
1892 for (( i=${#count}; i < 4; i++ )); do output="${output}0"; done
1893 output="${output}${count}"
1894
1895 echo "${output}"
1896 }
1897
1898 # call with
1899 # 'get_uninstall_candidates (--pcat cat --protected pcat/pfull) --pname PNAME'
1900 # returns /path/to/magefile(s)
1901 get_uninstall_candidates()
1902 {
1903 local search_pname
1904 local pkg
1905 local pcat
1906 local pname
1907 local pver
1908 local pbuild
1909 local list
1910 local pcatdir
1911 local protected
1912 local i
1913
1914 # very basic getops
1915 for i in $*
1916 do
1917 case $1 in
1918 --pcat|-c) shift; pcatdir="$1" ;;
1919 --pname|-n) shift; search_pname="$1" ;;
1920 --protected|-p) shift; protected="$1" ;;
1921 esac
1922 shift
1923 done
1924
1925 # it's not good to complain here about empty pnames; better to continue later anyway
1926 # # sanity checks; abort if not given
1927 # [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."
1928
1929
1930 # check needed global vars
1931 [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."
1932
1933 # set pcatdir to '*' if empty
1934 [ -z "${pcatdir}" ] && pcatdir='*'
1935
1936 for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*
1937 do
1938 # abort if not a dir
1939 [ ! -d ${pkg} ] && continue
1940
1941 pname="$(magename2pname ${pkg})"
1942
1943 if [[ ${search_pname} = ${pname} ]]
1944 then
1945 pcat="$(magename2pcat ${pkg} installdb)"
1946 pver="$(magename2pver ${pkg})"
1947 pbuild="$(magename2pbuild ${pkg})"
1948
1949 # exclude proteced
1950 [[ ${protected} = ${pcat}/${pname}-${pver}-${pbuild} ]] && continue
1951
1952 list="${list} ${pcat}/${pname}-${pver}-${pbuild}"
1953 fi
1954 done
1955
1956 echo "${list}"
1957 }
1958
1959 # reads virtualdb file
1960 #$1 = virtualname; $2 commands: showpkgs, showline
1961 #return 0 == installed -> shows installed pkg as well
1962 #return 1 == not installed
1963 virtuals_read()
1964 {
1965 local virtualname="$1"
1966 local command="$2"
1967 local virtline
1968 local line x i
1969
1970 # parse file to get virtual_name line
1971 IFS=$'\n'
1972 for line in $(< ${MROOT}${VIRTUALDB_FILE})
1973 do
1974 IFS=$' '
1975 for x in ${line}
1976 do
1977 if [[ ${x} = ${virtualname} ]]
1978 then
1979 virtline="${line}"
1980 [[ ${command} = showline ]] && echo "${line}"
1981 fi
1982 done
1983 IFS=$'\n'
1984 done
1985
1986 unset IFS
1987
1988 # now read the packages linked to VIRTUAL_NAME and output them
1989 if [ -n "${virtline}" ]
1990 then
1991 if [[ ${command} = showpkgs ]]
1992 then
1993 declare -i x=0
1994 for i in ${virtline}
1995 do
1996 if [ ${x} -ge 1 ]
1997 then
1998 echo "${i}"
1999 fi
2000 ((x++))
2001 done
2002 fi
2003 return 0
2004 fi
2005 return 1
2006 }
2007
2008
2009 #add pkg to virtualdb
2010 # $1 == virtualname $2= pkgname
2011 # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
2012 virtuals_add()
2013 {
2014 local virtualname="$1"
2015 local pkgname="$2"
2016 local oldline
2017 local line i
2018 local installed_file
2019 local OLDIFS
2020
2021 if virtuals_read ${virtualname}
2022 then
2023 # make sure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
2024 for i in $(virtuals_read ${virtualname} showpkgs)
2025 do
2026 if [[ ${i} = ${pkgname} ]]
2027 then
2028 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2029 echo "${pkgname} already linked as ${virtualname} ..."
2030 #return 3
2031 return 0
2032 fi
2033 done
2034
2035 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2036 echo "updating ${virtualname} entry with ${pkgname} ..."
2037 oldline="$(virtuals_read ${virtualname} showline)"
2038
2039 # make a backup
2040 mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old
2041
2042 OLDIFS="${IFS}"
2043 IFS=$'\n'
2044 for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)
2045 do
2046 # if the right line, append ${pkgname}, else do nothing
2047 if [[ ${line} = ${oldline} ]]
2048 then
2049 echo "${line} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
2050 else
2051 echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}
2052 fi
2053 done
2054 # unset IFS
2055 IFS="${OLDIFS}"
2056 else
2057 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2058 echo "register ${pkgname} as ${virtualname} ..."
2059 echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
2060 fi
2061
2062 return 0
2063 }
2064
2065 #deletes pakages from virtual database
2066 #$1 virtualname; $2 pkgname
2067 virtuals_del()
2068 {
2069
2070 local virtualname="$1"
2071 local pkgname="$2"
2072 local oldline
2073 local method
2074 local line i x
2075 local pkg_installed
2076 local OLDIFS
2077
2078 # first check if exists
2079 if virtuals_read ${virtualname}
2080 then
2081 # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
2082 declare -i x=0
2083 for i in $(virtuals_read ${virtualname} showpkgs)
2084 do
2085 if [[ ${i} = ${pkgname} ]]
2086 then
2087 pkg_installed=true
2088 fi
2089 ((x++))
2090 done
2091
2092 # abort if not installed
2093 if [[ ${pkg_installed} != true ]]
2094 then
2095 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2096 echo "${pkgname} does not exists in ${virtualname}."
2097 return 0
2098 fi
2099
2100 if [ ${x} -ge 2 ]
2101 then
2102 method=update
2103 else
2104 method=delall
2105 fi
2106
2107 # get the complete line
2108 oldline="$(virtuals_read ${virtualname} showline)"
2109
2110 # make a backup of the db
2111 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
2112
2113 # parse virtualdb
2114 OLDIFS="${IFS}"
2115 IFS=$'\n'
2116 for line in $(< ${VIRTUALDB_FILE}.old)
2117 do
2118 if [[ ${line} = ${oldline} ]]
2119 then
2120 #delall or update?
2121 case ${method} in
2122 update)
2123 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2124 echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..."
2125 # del PKG_NAME from line
2126 echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE}
2127 ;;
2128 delall)
2129 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2130 echo "Deleting ${virtualname} in virtual database ..."
2131 # continue; do not write anything
2132 continue
2133 ;;
2134 esac
2135 else
2136 echo "${line}" >> ${VIRTUALDB_FILE}
2137 fi
2138 done
2139 # unset IFS
2140 IFS="${OLDIFS}"
2141 else
2142 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2143 echo "${virtualname} does not exists in virtual database."
2144 fi
2145 }
2146
2147 # gets real pkgname from virtuals.default
2148 #$1=VIRTUAL_NAME; returns PKG_NAME
2149 default_virtualname_to_pkgname()
2150 {
2151 local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
2152
2153 VIRTUAL_NAME=$1
2154
2155 while read db_virtualname db_pkgname
2156 do
2157 if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
2158 then
2159 PKG_NAME="${db_pkgname}"
2160 fi
2161 done << EOF
2162 $(< ${VIRTUALDB_DEFAULTS})
2163 EOF
2164
2165 if [ -n "${PKG_NAME}" ]
2166 then
2167 echo "${PKG_NAME}"
2168 fi
2169 }
2170
2171 minclude()
2172 {
2173 local i
2174
2175 if [[ -n $* ]]
2176 then
2177 for i in $*
2178 do
2179 mqueryfeature "debug" && \
2180 echo "--- Including ${MAGEDIR}/include/${i}.minc"
2181 source ${MAGEDIR}/include/${i}.minc
2182 done
2183 mqueryfeature "debug" && echo
2184 fi
2185 }
2186
2187 sminclude()
2188 {
2189 local i
2190
2191 if [[ -n $* ]]
2192 then
2193 for i in $*
2194 do
2195 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
2196 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
2197 done
2198 echo
2199 fi
2200 }
2201
2202 # checks if an newer mage version is available
2203 is_newer_mage_version_available()
2204 {
2205 local newest_mage
2206 local installed_mage
2207
2208 newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)"
2209 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
2210
2211 if [[ ${newest_mage} > ${installed_mage} ]]
2212 then
2213 echo
2214 echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
2215 echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
2216 echo "It is recommened to install this newer version"
2217 echo "or your current system installation may break."
2218 echo
2219 echo -en "Please update mage by running "
2220 echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
2221 echo
2222 fi
2223 }
2224
2225
2226 # returns pname from pkgname
2227 # pkgname2pname $PKGNAME
2228 pkgname2pname()
2229 {
2230 local pname
2231
2232 pname="${1%-*-*-*}"
2233 echo "${pname}"
2234 }
2235
2236 # returns pver from pkgname
2237 # pkgname2pver $PKGNAME
2238 pkgname2pver()
2239 {
2240 local i pver
2241
2242 i="${1/$(pkgname2pname $1)-/}"
2243 pver="${i%-*-*}"
2244 echo "${pver}"
2245 }
2246
2247 # returns pbuild from pkgname
2248 # pkgname2pbuild $PKGNAME
2249 pkgname2pbuild()
2250 {
2251 local pbuild
2252
2253 pbuild="${1##*-}"
2254 echo "${pbuild}"
2255 }
2256
2257 # returns parch from pkgname
2258 # pkgname2parch $PKGNAME
2259 pkgname2parch()
2260 {
2261 local i x parch
2262
2263 i="${1%-*-*}-"
2264 x="${1%-*}"
2265 parch="${x/${i}/}"
2266 echo "${parch}"
2267 }
2268
2269 # returns pname from magename
2270 # magename2pname /PATH/TO/MAGE/FILE
2271 magename2pname()
2272 {
2273 local i pname
2274
2275 i="$(basename $1 .mage)"
2276 pname="${i%-*-*}"
2277 echo "${pname}"
2278 }
2279
2280 # returns pver from magename
2281 # magename2pver /PATH/TO/MAGE/FILE
2282 magename2pver()
2283 {
2284 local i pver
2285
2286 i="$(basename $1 .mage)"
2287 i="${i/$(magename2pname $1)-/}"
2288 pver="${i%-*}"
2289 echo "${pver}"
2290 }
2291
2292 # returns pbuild from magename
2293 # magename2pbuild /PATH/TO/MAGE/FILE
2294 magename2pbuild()
2295 {
2296 local i pbuild
2297
2298 i="$(basename $1 .mage)"
2299 pbuild="${i##*-}"
2300 echo "${pbuild}"
2301 }
2302
2303 # returns pcat from magename
2304 # magename2pcat /PATH/TO/MAGE/FILE
2305 magename2pcat()
2306 {
2307 local i pcat
2308
2309 if [[ ${2} = installdb ]]
2310 then
2311 # go 1 dir back
2312 i="${1%/*}"
2313 else
2314 # go 2 dirs back
2315 i="${1%/*/*}"
2316 fi
2317
2318 # get basename
2319 pcat="${i##*/}"
2320 echo "${pcat}"
2321 }
2322
2323 # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION)
2324 # dep2pcat DEPEND
2325 dep2pcat()
2326 {
2327 local pcat
2328
2329 pcat="${1%/*}"
2330 echo "${pcat}"
2331 }
2332
2333 # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION)
2334 # $2=virtual is used to resolv VDEPEND from virtual packages
2335 # dep2pcat DEPEND (virtual)
2336 dep2pname()
2337 {
2338 local pname
2339
2340 pname="${1##*/}"
2341
2342 # cut version only if not virtual or it will cut the name
2343 if [[ $(dep2pcat $1) != virtual ]] && \
2344 [[ $2 != virtual ]]
2345 then
2346 pname="${pname%-*}"
2347 fi
2348
2349 echo "${pname}"
2350 }
2351
2352 dep2highest_magefile()
2353 {
2354 local pcat
2355 local pname
2356 local magefile
2357 local installed_virtuals
2358
2359 pcat="$(dep2pcat $1)"
2360 pname="$(dep2pname $1)"
2361
2362 if [[ ${pcat} = virtual ]]
2363 then
2364 # first check if virtual is already installed
2365 installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)"
2366 if [ -n "${installed_virtuals}" ]
2367 then
2368 for vpkg in ${installed_virtuals}
2369 do
2370 realpkgname="${vpkg}"
2371 virtualpkgname="${pcat}/${pname}"
2372 pcat="$(dep2pcat ${realpkgname})"
2373 pname="$(dep2pname ${realpkgname} virtual)"
2374 done
2375 else
2376 # choose one from virtualdb defaults (virtuals.defaults)
2377 realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})"
2378 virtualpkgname="${pcat}/${pname}"
2379 pcat="$(dep2pcat ${realpkgname})"
2380 pname="$(dep2pname ${realpkgname} virtual)"
2381 fi
2382 fi
2383
2384 magefile="$(get_highest_magefile ${pcat} ${pname})"
2385 echo "${magefile}"
2386 }
2387
2388 # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD}
2389 is_installed()
2390 {
2391 local fullpkgname="$1"
2392
2393 # return 0 if installed
2394 [ -d ${MROOT}${INSTALLDB}/${fullpkgname} ] && return 0
2395
2396 return 1
2397 }
2398
2399 install_packages()
2400 {
2401 local list="$@"
2402 local pkg
2403 local pcat
2404 local pname
2405 local pver
2406 local pbuild
2407 local total_pkgs
2408 local current_pkg
2409 local src_install
2410 local uninstall_list
2411
2412 # check for --src-install
2413 if [[ $1 = --src-install ]]
2414 then
2415 # remove --src-install from list
2416 list=${list/--src-install/}
2417 # enable src-install
2418 src_install="--src-install"
2419 fi
2420
2421 # reset MAGE_PROTECT_COUNTER
2422 declare -i MAGE_PROTECT_COUNTER=0
2423 export MAGE_PROTECT_COUNTER
2424
2425 # get count of total packages
2426 declare -i total_pkgs=0
2427 declare -i current_pkg=0
2428 for i in ${list}; do (( total_pkgs++ )); done
2429
2430 echo
2431
2432 if [[ -n ${MROOT} ]]
2433 then
2434 echo -ne ${COLRED}
2435 echo "!! installing in MROOT=${MROOT}"
2436 echo -ne ${COLDEFAULT}
2437 echo
2438 fi
2439
2440 for pkg in ${list}
2441 do
2442 (( current_pkg++ ))
2443 pcat=$(magename2pcat ${pkg})
2444 pname=$(magename2pname ${pkg})
2445 pver=$(magename2pver ${pkg})
2446 pbuild=$(magename2pbuild ${pkg})
2447
2448 mage_install \
2449 --pcat ${pcat} \
2450 --pname ${pname} \
2451 --pver ${pver} \
2452 --pbuild ${pbuild} \
2453 --count-total ${total_pkgs} \
2454 --count-current ${current_pkg} \
2455 ${src_install}
2456
2457 # check for allready installed packages and remove them
2458 # except the package we have installed
2459 uninstall_list="$(get_uninstall_candidates \
2460 --pcat "${pcat}" \
2461 --pname "${pname}" \
2462 --protected ${pcat}/${pname}-${pver}-${pbuild})"
2463
2464 # uninstall all packges in uninstall_list if not empty
2465 if [ -n "${uninstall_list}" ]
2466 then
2467 echo
2468 uninstall_packages ${uninstall_list} \
2469 || die "install_packges() uninstalling not-needed."
2470 fi
2471
2472 # crlf for better view in VERBOSE mode
2473 #if [[ ${VERBOSE} = on ]]; then echo; fi
2474 echo
2475 done
2476
2477 #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}"
2478 show_etc_update_mesg
2479 }
2480
2481 # get_value_from_magefile VARIABLE
2482 # returns the content of this VAR
2483 get_value_from_magefile()
2484 {
2485 local var="$1"
2486 local magefile="$2"
2487 local value
2488
2489 [[ -z ${var} ]] && return 1
2490 [[ -z ${magefile} ]] && return 1
2491
2492 # local all possible vars of a mage file
2493 # to prevent bad issues
2494 local PKGNAME
2495 local STATE
2496 local DESCRIPTION
2497 local HOMEPAGE
2498 local DEPEND
2499 local SDEPEND
2500 local PROVIDE
2501 local PKGTYPE
2502 local MAGE_TARGETS
2503 local SPLIT_PACKAGE_BASE
2504 local preinstall
2505 local postinstall
2506 local preremove
2507 local postremove
2508
2509 # sanity checks
2510 [ -f ${magefile} ] && source ${magefile} || \
2511 die "get_value_from_magefile: ${magefile} not found."
2512 [ -z "${var}" ] && die "get_value_from_magefile: \$var not given."
2513
2514 source ${magefile}
2515 eval value=\$$(echo ${var})
2516 echo "${value}"
2517
2518 # unset these functions
2519 unset -f preinstall
2520 unset -f postinstall
2521 unset -f preremove
2522 unset -f postremove
2523 }
2524
2525 mage_install()
2526 {
2527 # local all possible vars of a mage file
2528 # to prevent bad issues
2529 local PKGNAME
2530 local STATE
2531 local DESCRIPTION
2532 local HOMEPAGE
2533 local DEPEND
2534 local SDEPEND
2535 local PROVIDE
2536 local PKGTYPE
2537 local preinstall
2538 local postinstall
2539 local preremove
2540 local postremove
2541
2542 local pcat
2543 local pname
2544 local pver
2545 local pbuild
2546 local count_total
2547 local count_current
2548 local magefile
2549 local src_install
2550 local i
2551
2552 # very basic getops
2553 for i in $*
2554 do
2555 case $1 in
2556 --pcat|-c) shift; pcat="$1" ;;
2557 --pname|-n) shift; pname="$1" ;;
2558 --pver|-v) shift; pver="$1" ;;
2559 --pbuild|-b) shift; pbuild="$1" ;;
2560 --count-total) shift; count_total="$1" ;;
2561 --count-current) shift; count_current="$1" ;;
2562 --src-install|-s) shift; src_install=true ;;
2563 esac
2564 shift
2565 done
2566
2567 # sanity checks; abort if not given
2568 [ -z "${pcat}" ] && die "mage_install() \$pcat not given."
2569 [ -z "${pname}" ] && die "mage_install() \$pname not given."
2570 [ -z "${pver}" ] && die "mage_install() \$pver not given."
2571 [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given."
2572
2573 # check needed global vars
2574 [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set."
2575 [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set."
2576 [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set."
2577
2578 xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]"
2579 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2580 echo -n "installing (${count_current}/${count_total}): "
2581 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2582 echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2583
2584 magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
2585 source ${magefile}
2586
2587 # abort on sources if no srcinstall
2588 if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]]
2589 then
2590 echo
2591 echo -e "This Package is a Source Package."
2592 echo
2593 echo -e "Only 'srcinstall' works with this type of packages"
2594 echo -en "If you have done a srcinstall before, "
2595 echo -e "you will find the files in /usr/src."
2596 echo
2597 exit 1
2598 fi
2599
2600 ## preinstall scripts
2601 if [ -n "$(typeset -f preinstall)" ]
2602 then
2603 echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... "
2604 preinstall
2605 unset preinstall
2606 fi
2607
2608 if [[ ${src_install} = true ]]
2609 then
2610 local smage2file
2611 # check needed global vars
2612 [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set."
2613 [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set."
2614 [ -z "${BINDIR}" ] && die "\$BINDIR not set."
2615
2616 # build the package first
2617 if [[ ${MAGEDEBUG} = on ]]
2618 then
2619 echo M:${pname}
2620 echo V:${pver}
2621 echo B:${pbuild}
2622 fi
2623
2624 if [[ -n ${MAGE_TARGETS} ]]
2625 then
2626 # basic svn compat
2627 if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2628 then
2629 for i in ${SMAGESCRIPTSDIR}/*/${pname/${MAGE_TARGETS}/}/${pname/${MAGE_TARGETS}/}-${pver}-${pbuild}.smage2
2630 do
2631 smage2file="${i}"
2632 done
2633 else
2634 smage2file=${SMAGESCRIPTSDIR}/${pname/${MAGE_TARGETS}/}/${pname/${MAGE_TARGETS}/}-${pver}-${pbuild}.smage2
2635 fi
2636
2637 elif [[ -n ${SPLIT_PACKAGE_BASE} ]]
2638 then
2639 # basic svn compat
2640 if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2641 then
2642 for i in ${SMAGESCRIPTSDIR}/*/${SPLIT_PACKAGE_BASE}/${SPLIT_PACKAGE_BASE}-${pver}-${pbuild}.smage2
2643 do
2644 smage2file="${i}"
2645 done
2646 else
2647 smage2file=${SMAGESCRIPTSDIR}/${SPLIT_PACKAGE_BASE}/${SPLIT_PACKAGE_BASE}-${pver}-${pbuild}.smage2
2648 fi
2649
2650 else
2651 # basic svn compat
2652 if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2653 then
2654 for i in ${SMAGESCRIPTSDIR}/*/${pname}/${pname}-${pver}-${pbuild}.smage2
2655 do
2656 smage2file="${i}"
2657 done
2658 else
2659 smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2660 fi
2661 fi
2662
2663 if [ -f "${smage2file}" ]
2664 then
2665 echo -e " ${COLBLUE}***${COLDEFAULT} building package from source ... "
2666 smage2 ${smage2file} || die "compile failed"
2667 else
2668 echo
2669 echo "$(basename ${SMAGEFILE}) not found."
2670 echo "update your smage-tree and try it again."
2671 echo
2672 die
2673 fi
2674 fi
2675
2676 if [[ ${PKGTYPE} != virtual ]] && \
2677 [[ ${PKGTYPE} != sources ]]
2678 then
2679 echo -e " ${COLBLUE}***${COLDEFAULT} merging files into system ... "
2680 build_doinstall ${PKGNAME}
2681 fi
2682
2683 ## postinstall scripts
2684 if [ -n "$(typeset -f postinstall)" ]
2685 then
2686 echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... "
2687 postinstall
2688 unset postinstall
2689 fi
2690
2691 # install a database entry
2692 install_database_entry \
2693 --pcat "${pcat}" \
2694 --pname "${pname}" \
2695 --pver "${pver}" \
2696 --pbuild "${pbuild}" \
2697 --pkgname "${PKGNAME}" \
2698 --pkgtype "${PKGTYPE}" \
2699 || die "error in mage_install() running install_database_entry()."
2700
2701 # remove the package dir now
2702 if [ -d ${BUILDDIR}/${PKGNAME} ]
2703 then
2704 rm -rf ${BUILDDIR}/${PKGNAME}
2705 fi
2706
2707 # rebuilds toplevel info node
2708 if [[ ${MAGE_INFO_REBUILD} = true ]]
2709 then
2710 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2711 echo -n "rebuilding top-level info node ... "
2712 ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2713 > ${MROOT}/usr/share/info/dir && \
2714 echo "done." || echo "failure."
2715 unset MAGE_INFO_REBUILD
2716 fi
2717
2718 # rebuilds the enviroment with the content of /etc/env.d
2719 if [[ ${MAGE_ENV_REBUILD} = true ]]
2720 then
2721 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2722 echo -n "rebuilding environment ... "
2723 ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2724 echo "done." || echo "failure."
2725 unset MAGE_ENV_REBUILD
2726 fi
2727
2728 xtitleclean
2729
2730 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2731 echo -n "package "
2732 # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2733 # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2734 echo "successfully installed."
2735
2736 # unset these functions
2737 unset -f preinstall
2738 unset -f postinstall
2739 unset -f preremove
2740 unset -f postremove
2741 }
2742
2743 md5sum_packages()
2744 {
2745 local list="$@"
2746 local magefile
2747 local pcat
2748 local pname
2749 local pkgname
2750 local pkgfile
2751 local pkgtype
2752 local count_current
2753 local count_total
2754
2755 # get count of total packages
2756 declare -i count_current=0
2757 declare -i count_total=0
2758
2759 for i in ${list}; do (( count_total++ )); done
2760
2761 for magefile in ${list}
2762 do
2763 pcat=$(magename2pcat ${magefile})
2764 pname=$(magename2pname ${magefile})
2765 pkgname="$(get_value_from_magefile PKGNAME ${magefile})"
2766 md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pkgname}.md5"
2767 pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
2768 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
2769
2770 (( count_current++ ))
2771 xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]"
2772
2773 # abort on virtual pkg
2774 if [[ ${pkgtype} = virtual ]]
2775 then
2776 echo -ne " ${COLBLUE}---${COLDEFAULT}"
2777 echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2778 continue
2779 fi
2780
2781 # abort on sources pkg
2782 if [[ ${pkgtype} = sources ]]
2783 then
2784 echo -ne " ${COLBLUE}---${COLDEFAULT}"
2785 echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2786 continue
2787 fi
2788
2789 if [ -f "${md5file}" ]
2790 then
2791 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2792 echo -ne "checking md5sum (${count_current}/${count_total}): "
2793 mchecksum --rundir "${PKGDIR}" --file "${md5file}" --method md5 || die "md5 for ${pkgfile} failed"
2794 else
2795 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2796 echo -e "!! no md5sum file found for ${pkgfile} :("
2797 fi
2798 done
2799
2800 # add a crlf for a better view
2801 if [ ${count_total} -gt 1 ]; then echo; fi
2802 }
2803
2804 ## uninstall_packages ulist
2805 uninstall_packages()
2806 {
2807 local list="$@"
2808 local pcat
2809 local pname
2810 local pver
2811 local pbuild
2812 local can_pcat
2813 local can_pname
2814 local can_ver_list
2815
2816 if [[ -n ${MROOT} ]]
2817 then
2818 echo -ne ${COLRED}
2819 echo "!! uninstalling from MROOT=${MROOT}"
2820 echo -ne ${COLDEFAULT}
2821 echo
2822 fi
2823
2824 # generate a candidates list
2825 for pkg in ${list}
2826 do
2827 pcat=$(dep2pcat ${pkg})
2828 pname=$(magename2pname ${pkg})
2829 pver=$(magename2pver ${pkg})
2830 pbuild=$(magename2pbuild ${pkg})
2831 can_pcat="${pcat}"
2832 can_pname="${pname}"
2833
2834 if [ -z "${can_ver_list}" ]
2835 then
2836 can_ver_list=" ${pver}-${pbuild}"
2837 else
2838 can_ver_list="${can_ver_list}, ${pver}-${pbuild}"
2839 fi
2840 done
2841
2842 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2843 echo "following candidate(s) will be removed:"
2844 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2845 echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}"
2846 echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"
2847 echo
2848 if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ]
2849 then
2850 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2851 echo "( Press [CTRL+C] to abort )"
2852 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2853 echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."
2854 for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))
2855 do
2856 echo -ne "${COLRED} ${i}${COLDEFAULT}"
2857 sleep 1
2858 done
2859 echo
2860 echo
2861 fi
2862
2863 for pkg in ${list}
2864 do
2865 pcat=$(dep2pcat ${pkg})
2866 pname=$(magename2pname ${pkg})
2867 pver=$(magename2pver ${pkg})
2868 pbuild=$(magename2pbuild ${pkg})
2869
2870 mage_uninstall \
2871 --pcat ${pcat} \
2872 --pname ${pname} \
2873 --pver ${pver} \
2874 --pbuild ${pbuild} \
2875 --count-total ${total_pkgs} \
2876 --count-current ${current_pkg} \
2877 ${src_install}
2878
2879 # crlf for better view in VERBOSE mode
2880 #if [[ ${VERBOSE} = on ]]; then echo; fi
2881 echo
2882 done
2883 }
2884
2885 mage_uninstall()
2886 {
2887 # local all possible vars of a mage file
2888 # to prevent bad issues
2889 local PKGNAME
2890 local STATE
2891 local DESCRIPTION
2892 local HOMEPAGE
2893 local DEPEND
2894 local SDEPEND
2895 local PROVIDE
2896 local PKGTYPE
2897 local preinstall
2898 local postinstall
2899 local preremove
2900 local postremove
2901
2902 local pcat
2903 local pname
2904 local pver
2905 local pbuild
2906 local magefile
2907 local i
2908
2909 # very basic getops
2910 for i in $*
2911 do
2912 case $1 in
2913 --pcat|-c) shift; pcat="$1" ;;
2914 --pname|-n) shift; pname="$1" ;;
2915 --pver|-v) shift; pver="$1" ;;
2916 --pbuild|-b) shift; pbuild="$1" ;;
2917 esac
2918 shift
2919 done
2920
2921 # sanity checks; abort if not given
2922 [ -z "${pcat}" ] && die "mage_uninstall() \$pcat not given."
2923 [ -z "${pname}" ] && die "mage_uninstall() \$pname not given."
2924 [ -z "${pver}" ] && die "mage_uninstall() \$pver not given."
2925 [ -z "${pbuild}" ] && die "mage_uninstall() \$pbuild not given."
2926
2927 # check needed global vars
2928 [ -z "${MAGEDIR}" ] && die "mage_uninstall() \$MAGEDIR not set."
2929 [ -z "${INSTALLDB}" ] && die "mage_uninstall() \$INSTALLDB not set."
2930 [ -z "${BUILDDIR}" ] && die "mage_uninstall() \$BUILDDIR not set."
2931
2932 xtitle "[ (${count_current}/${count_total}) Removing ${pcat}/${pname}-${pver}-${pbuild} ]"
2933 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2934 echo -n "removing: "
2935 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2936 echo -e "${COLRED}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2937
2938 magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2939 source ${magefile}
2940
2941 ## preremove scripts
2942 if [ -n "$(typeset -f preremove)" ]
2943 then
2944 echo -e " ${COLBLUE}***${COLDEFAULT} running preremove ... "
2945 preremove
2946 unset preremove
2947 fi
2948
2949 # runs uninstall
2950 build_douninstall \
2951 --pcat "${pcat}" \
2952 --pname "${pname}" \
2953 --pver "${pver}" \
2954 --pbuild "${pbuild}"
2955
2956 ## postremove scripts
2957 if [ -n "$(typeset -f postremove)" ]
2958 then
2959 echo -e " ${COLBLUE}***${COLDEFAULT} running postremove ... "
2960 postremove
2961 unset postremove
2962 fi
2963
2964 # removes the database entry
2965 remove_database_entry \
2966 --pcat "${pcat}" \
2967 --pname "${pname}" \
2968 --pver "${pver}" \
2969 --pbuild "${pbuild}" \
2970 || die "error in mage_uninstall() running remove_database_entry()."
2971
2972 # rebuilds toplevel info node
2973 if [[ ${MAGE_INFO_REBUILD} = true ]]
2974 then
2975 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2976 echo -n "rebuilding top-level info node ... "
2977 ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2978 > ${MROOT}/usr/share/info/dir && \
2979 echo "done." || echo "failure."
2980 unset MAGE_INFO_REBUILD
2981 fi
2982
2983 # rebuilds the enviroment with the content of /etc/env.d
2984 if [[ ${MAGE_ENV_REBUILD} = true ]]
2985 then
2986 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2987 echo -n "rebuilding environment ... "
2988 ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2989 echo "done." || echo "failure."
2990 unset MAGE_ENV_REBUILD
2991 fi
2992
2993 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2994 echo -n "package "
2995 # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2996 # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2997 echo "successfully removed."
2998
2999 # unset these functions
3000 unset -f preinstall
3001 unset -f postinstall
3002 unset -f preremove
3003 unset -f postremove
3004 }
3005
3006 show_etc_update_mesg()
3007 {
3008 [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
3009
3010 echo
3011 echo -ne "${COLRED}"
3012 echo "Important:"
3013 echo -ne ${COLDEFAULT}
3014 echo "${MAGE_PROTECT_COUNTER} protected file(s) were installed."
3015 echo
3016 echo "Please run 'etc-update' to update your configuration files."
3017 echo
3018 }
3019
3020 pkgsearch()
3021 {
3022 local string="$1"
3023 local result
3024 local pkg
3025 local pcat
3026 local pname
3027 local magefile
3028 local pver
3029 local pbuild
3030 local state
3031 local descriptiom
3032 local homepage
3033 local license
3034 local i
3035 local all_installed
3036 local ipver
3037 local ipbuild
3038 local latest_available
3039 local depsfull
3040 local sdepsfull
3041 local deps
3042 local sdeps
3043 local dep
3044 local sign
3045
3046 # only names no versions
3047 result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name '*'${string}'*'| sed '/profiles/d' | sed '/includes/d')"
3048 #result="$(find ${MAGEDIR} -type f -name '*'${string}'*'.mage | sort)"
3049
3050 # nothing found
3051 [[ -z ${result} ]] && die "No package found containing '${string}' in the name."
3052
3053 for pkg in ${result}
3054 do
3055 # dirty, but does the job
3056 pcat="$(magename2pcat ${pkg}/foo)"
3057 pname="$(magename2pname ${pkg}-foo-foo)"
3058
3059 # get highest version available
3060 magefile=$(get_highest_magefile ${pcat} ${pname})
3061
3062 if [[ ! -z ${magefile} ]]
3063 then
3064 # now get all needed infos to print a nice output
3065 pver="$(magename2pver ${magefile})"
3066 pbuild="$(magename2pbuild ${magefile})"
3067 state="$(get_value_from_magefile STATE ${magefile})"
3068 description="$(get_value_from_magefile DESCRIPTION ${magefile})"
3069 homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
3070 license="$(get_value_from_magefile LICENSE ${magefile})"
3071
3072 # all installed
3073 for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
3074 do
3075 ipver="$(magename2pver ${i})"
3076 ipbuild="$(magename2pbuild ${i})"
3077
3078 if [[ -z ${all_installed} ]]
3079 then
3080 all_installed="${ipver}-${ipbuild}"
3081 else
3082 all_installed="${all_installed} ${ipver}-${ipbuild}"
3083 fi
3084 done
3085 [[ -z ${all_installed} ]] && all_installed="none"
3086
3087 case ${state} in
3088 stable) state=${COLGREEN}"[s] ";;
3089 testing) state=${COLYELLOW}"[t] ";;
3090 unstable) state=${COLRED}"[u] ";;
3091 old) state=${COLGRAY}"[o] ";;
3092 esac
3093
3094 latest_available="${pver}-${pbuild}"
3095 else
3096 # package is masked
3097 state="${COLRED}[m] "
3098 latest_available="${COLRED}masked for this distribution.${COLDEFAULT}"
3099 fi
3100
3101 depsfull="$(get_value_from_magefile DEPEND ${magefile})"
3102 sdepsfull="$(get_value_from_magefile SDEPEND ${magefile})"
3103
3104 while read sign dep
3105 do
3106 case ${dep} in
3107 "") continue;;
3108 esac
3109
3110 deps="${deps} $(basename ${dep%-*})"
3111 done << EOF
3112 ${depsfull}
3113 EOF
3114
3115 while read sign dep
3116 do
3117 case ${dep} in
3118 "") continue;;
3119 esac
3120
3121 sdeps="${sdeps} $(basename ${dep%-*})"
3122 done << EOF
3123 ${sdepsfull}
3124 EOF
3125
3126 echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
3127 echo -e " Latest available: ${latest_available}"
3128 echo " Installed versions: ${all_installed}"
3129 echo " Description: ${description}"
3130 echo " Homepage: ${homepage}"
3131 if [[ ! -z ${license} ]]
3132 then
3133 echo " License: ${license}"
3134 fi
3135 echo " Depends: ${deps}"
3136 echo " SDepends: ${sdeps}"
3137 echo
3138
3139 unset pcat
3140 unset pname
3141 unset magefile
3142 unset pver
3143 unset pbuild
3144 unset state
3145 unset descriptiom
3146 unset homepage
3147 unset all_installed
3148 unset ipver
3149 unset ipbuild
3150 unset depsfull
3151 unset sdepsfull
3152 unset deps
3153 unset sdeps
3154 unset dep
3155 unset sign
3156 done
3157 }
3158
3159 export_inherits()
3160 {
3161 local include="$1"
3162 shift
3163
3164 while [ "$1" ]
3165 do
3166 local functions="$1"
3167
3168 # sanity checks
3169 [ -z "${include}" ] && die "export_inherits(): \$include not given."
3170 [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
3171
3172 eval "${functions}() { ${include}_${functions} ; }"
3173
3174 # debug
3175 mqueryfeature "debug" && typeset -f "${functions}"
3176
3177 shift
3178 done
3179 }
3180
3181 mlibdir()
3182 {
3183 local libdir=lib
3184 [[ ${ARCH} = x86_64 ]] && libdir=lib64
3185
3186 echo "${libdir}"
3187 }
3188
3189 ## blacklisted ${magefile}
3190 blacklisted()
3191 {
3192 [[ -z ${MAGE_DISTRIBUTION} ]] && local MAGE_DISTRIBUTION=stable
3193
3194 # compat
3195 [[ ${USE_UNSTABLE} = true ]] && local MAGE_DISTRIBUTION=unstable
3196 [[ ${USE_TESTING} = true ]] && local MAGE_DISTRIBUTION=testing
3197
3198 # support both types for the moment
3199 if [[ -f /etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION} ]]
3200 then
3201 local EXCLUDED="/etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION}"
3202 else
3203 local EXCLUDED="/etc/mage-profile/package.blacklist-${ARCH}"
3204 fi
3205
3206 # return 0 if the list not exist; nothin is masked
3207 [[ ! -f ${EXCLUDED} ]] && return 0
3208
3209 local MAGEFILE="$1"
3210
3211 local PCAT="$(magename2pcat ${MAGEFILE})"
3212 local PNAME="$(magename2pname ${MAGEFILE})"
3213 local PVER="$(magename2pver ${MAGEFILE})"
3214 local PBUILD="$(magename2pbuild ${MAGEFILE})"
3215
3216 local EXPCAT EXPNAME EXPVER EXPBUILD
3217 while read EXPCAT EXPNAME EXPVER EXPBUILD
3218 do
3219 # ignore spaces and comments
3220 case "${EXPCAT}" in
3221 \#*|"") continue ;;
3222 esac
3223
3224 # exclude full pver
3225 if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
3226 [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
3227 [[ -n ${PVER} ]] && [[ -n ${PBUILD} ]] &&
3228 [[ -n ${EXPVER} ]] && [[ -n ${EXPBUILD} ]]
3229 then
3230 [[ ${EXPCAT}/${EXPNAME}-${EXPVER}-${EXPBUILD} = ${PCAT}/${PNAME}-${PVER}-${PBUILD} ]] && return 1
3231 fi
3232
3233 # exclude pcat/pname only
3234 if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
3235 [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
3236 [[ -z ${EXPVER} ]] && [[ -z ${EXPBUILD} ]]
3237 then
3238 [[ ${EXPCAT}/${EXPNAME} = ${PCAT}/${PNAME} ]] && return 1
3239 fi
3240 done << EOF
3241 $( cat ${EXCLUDED}; echo)
3242 EOF
3243
3244 return 0
3245 }
3246
3247 # need_busybox_support ${cmd}
3248 # return 0 (no error = needs busybox support) or return 1 (error = no busybox support required)
3249 need_busybox_support()
3250 {
3251 local cmd
3252 cmd="$1"
3253
3254 if [[ -x /bin/busybox ]]
3255 then
3256 if [[ $(readlink $(which ${cmd})) = /bin/busybox ]]
3257 then
3258 # needs busybox support
3259 return 0
3260 fi
3261 fi
3262
3263 # no busybox
3264 return 1
3265 }
3266
3267 # busybox_filter_wget_options ${wget_opts}
3268 busybox_filter_wget_options()
3269 {
3270 local opts="$@"
3271 local i
3272 local fixed_opts
3273
3274 if need_busybox_support wget
3275 then
3276 for i in ${opts}
3277 do
3278 # show only the allowed ones
3279 case ${i} in
3280 -c|--continue) fixed_opts+=" -c" ;;
3281 -s|--spider) fixed_opts+=" -s" ;;
3282 -q|--quiet) fixed_opts+=" -q" ;;
3283 -O|--output-document) shift; fixed_opts+=" -O $1" ;;
3284 --header) shift; fixed_opts+=" --header $1" ;;
3285 -Y|--proxy) shift; fixed_opts+=" -Y $1" ;;
3286 -P) shift; fixed_opts+=" -P $1" ;;
3287 --no-check-certificate) fixed_opts+=" --no-check-certificate ${i}" ;;
3288 -U|--user-agent) shift; fixed_opts+=" -U ${i}" ;;
3289 # simply drop all other opts
3290 *) continue ;;
3291 esac
3292 done
3293
3294 echo "${fixed_opts}"
3295 else
3296 echo "${opts}"
3297 fi
3298 }
3299
3300 have_root_privileges()
3301 {
3302 local retval
3303
3304 if [[ $(id -u) = 0 ]]
3305 then
3306 retval=0
3307 else
3308 retval=1
3309 fi
3310
3311 return ${retval}
3312 }
3313
3314 known_mage_feature()
3315 {
3316 local feature="$1"
3317 local retval
3318
3319 case "${feature}" in
3320 autosvc|!autosvc) retval=0 ;;
3321 buildlog|!buildlog) retval=0 ;;
3322 ccache|!ccache) retval=0 ;;
3323 check|!check) retval=0 ;;
3324 compressdoc|!compressdoc) retval=0 ;;
3325 debug|!debug) retval=0 ;;
3326 distcc|!distcc) retval=0 ;;
3327 kernelsrcunpack|!kernelsrcunpack) retval=0 ;;
3328 libtool|!libtool) retval=0 ;;
3329 linuxsymlink|!linuxsymlink) retval=0 ;;
3330 pkgbuild|!pkgbuild) retval=0 ;;
3331 pkgdistrotag|!pkgdistrotag) retval=0 ;;
3332 purge|!purge) retval=0 ;;
3333 qalint|!qalint) retval=0 ;;
3334 regentree|!regentree) retval=0 ;;
3335 resume|!resume) retval=0 ;;
3336 srcpkgbuild|!srcpkgbuild) retval=0 ;;
3337 srcpkgtarball|!srcpkgtarball) retval=0 ;;
3338 static|!static) retval=0 ;;
3339 stepbystep|!stepbystep) retval=0 ;;
3340 strip|!strip) retval=0 ;;
3341 verbose|!verbose) retval=0 ;;
3342 *) retval=1 ;;
3343 esac
3344
3345 return "${retval}"
3346 }
3347
3348 load_mage_features()
3349 {
3350 for i in ${MAGE_FEATURES_GLOBAL[*]} ${MAGE_FEATURES[*]}
3351 do
3352 FVERBOSE=off msetfeature ${i}
3353 done
3354 }
3355
3356 msetfeature()
3357 {
3358 local feature
3359 local count
3360 local i
3361 local found
3362
3363 for feature in $@
3364 do
3365 found=0
3366 count="${#MAGE_FEATURES_CURRENT[*]}"
3367
3368 if ! known_mage_feature "${feature}"
3369 then
3370 [[ ${FVERBOSE} = off ]] || echo -e "${COLRED}Unknown feature '${feature}', ignoring it${COLDEFAULT}"
3371 return 3
3372 fi
3373
3374 for ((i=0; i<count; i++))
3375 do
3376 if [[ ${MAGE_FEATURES_CURRENT[${i}]} = ${feature} ]]
3377 then
3378 [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' already enabled${COLDEFAULT}"
3379 MAGE_FEATURES_CURRENT[${i}]="${feature}"
3380 found=1
3381 elif [[ ${MAGE_FEATURES_CURRENT[${i}]} = !${feature} ]]
3382 then
3383 [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' currently disabled, enabling it!${COLDEFAULT}"
3384 MAGE_FEATURES_CURRENT[${i}]="${feature}"
3385 found=1
3386 elif [[ ${MAGE_FEATURES_CURRENT[${i}]} = ${feature//!} ]]
3387 then
3388 [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature//!}' currently enabled, disabling it!${COLDEFAULT}"
3389 MAGE_FEATURES_CURRENT[${i}]="${feature}"
3390 found=1
3391 fi
3392 done
3393
3394 # if the feature was not found after proccessing the whole array
3395 # it was not declared. in this case enable it
3396 if [[ ${found} = 0 ]]
3397 then
3398 [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' was not declared, enabling it!${COLDEFAULT}"
3399 MAGE_FEATURES_CURRENT=( ${MAGE_FEATURES_CURRENT[*]} "${feature}" )
3400 fi
3401
3402 export MAGE_FEATURE_CURRENT
3403 done
3404 }
3405
3406 mqueryfeature()
3407 {
3408 local feature="$1"
3409 local retval=1
3410 local i
3411
3412 if known_mage_feature "${feature}"
3413 then
3414 for i in ${MAGE_FEATURES_CURRENT[*]}
3415 do
3416 if [[ ${i} = ${feature} ]]
3417 then
3418 retval=0
3419 break # found break here
3420 fi
3421 done
3422 else
3423 [[ ${FVERBOSE} = off ]] || echo -e "${COLRED}Unknown feature '${feature}', ignoring it${COLDEFAULT}"
3424 retval=3
3425 fi
3426
3427 return ${retval}
3428 }
3429
3430 mprintfeatures()
3431 {
3432 echo "Global features: ${MAGE_FEATURES_GLOBAL[*]}"
3433 echo "Local features: ${MAGE_FEATURES[*]}"
3434 echo "Current features: ${MAGE_FEATURES_CURRENT[*]}"
3435 }