Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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