Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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