Magellan Linux

Annotation of /branches/mage-next/src/mage4.functions.sh

Parent Directory Parent Directory | Revision Log Revision Log


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