Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 329 - (hide annotations) (download) (as text)
Thu Feb 16 22:11:06 2006 UTC (18 years, 2 months ago) by niro
File MIME type: application/x-sh
File size: 61059 byte(s)
fixed some install issues, when removing non existing uninstall-candidates ...

1 niro 226 #!/bin/bash
2     # Magellan Linux Installer Functions (mage.functions.sh)
3 niro 329 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.16 2006-02-16 22:11:06 niro Exp $
4 niro 226
5     mage_setup()
6     {
7     [ ! -d ${MROOT}${INSTALLDB} ] && \
8     install -d ${MROOT}${INSTALLDB}
9     [ ! -f ${MROOT}${VIRTUALDB_FILE} ] && \
10     touch ${MROOT}${VIRTUALDB_FILE}
11     [ ! -d ${PKGDIR} ] && install -d ${PKGDIR}
12     [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR}
13     [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR}
14    
15     return 0
16     }
17    
18     unpack_packages()
19     {
20     local list="$@"
21     local magefile
22     local pkg
23     local pkgtype
24     local count_current
25     local count_total
26    
27     # get count of total packages
28     declare -i count_current=0
29     declare -i count_total=0
30    
31     for i in ${list}; do (( count_total++ )); done
32    
33     for magefile in ${list}
34     do
35     pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
36     pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
37    
38     (( count_current++ ))
39     xtitle "[ (${count_current}/${count_total}) Unpacking ${pkg} ]"
40    
41     # abort on virtual pkg
42     if [[ ${pkgtype} = virtual ]]
43     then
44     echo -ne " ${COLBLUE}---${COLDEFAULT}"
45     echo " !unpack virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
46     continue
47     fi
48    
49     # abort on sources pkg
50     if [[ ${pkgtype} = sources ]]
51     then
52     echo -ne " ${COLBLUE}---${COLDEFAULT}"
53     echo " !unpack sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
54     continue
55     fi
56    
57     echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... "
58     tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"
59     done
60    
61     # add a crlf for a better view
62     if [ ${count_total} -gt 1 ]; then echo; fi
63     }
64    
65    
66     # fix_mtime path/to/$mtime/reffile $pathto/file
67     # creates a given reference file and fixes given file
68     # returns new mtime
69     fix_mtime()
70     {
71     local reference="$1"
72     local pathto="$2"
73     local mtime
74    
75     mtime=$(stat -c %Y "${reference}")
76     touch \
77     --no-create \
78     --time=mtime \
79     --reference "${reference}" \
80     "${pathto}"
81    
82     echo "${mtime}"
83     }
84    
85     # fix_descriptor pkgname/.dir "foo1" "foo2"
86     fix_descriptor()
87     {
88     local descriptor="$1"
89     local output
90     local i
91     shift
92    
93     for i in $@
94     do
95     if [[ -z ${output} ]]
96     then
97     output="${i}"
98     else
99     output="${output}§${i}"
100     fi
101     done
102    
103     echo "${output}" >> ${BUILDDIR}/${descriptor}_fixed
104     }
105    
106     ###################################################
107     # function install_direcories #
108     # install_direcories $PKGNAME #
109     ###################################################
110     install_directories()
111     {
112     local pkgname="$1"
113     local pathto
114     local posix
115     local user
116     local group
117     local IFS
118    
119     # sanity checks; abort if not given
120     [ -z "${pkgname}" ] && die "install_directories() \$pkgname not given."
121    
122     # check needed global vars
123     [ -z "${BUILDDIR}" ] && die "install_directories() \$BUILDDIR not set."
124    
125     [ ! -f ${BUILDDIR}/${pkgname}/.dirs ] && die "install_directories() .dirs not found"
126    
127     # sets fieldseperator to "§" instead of " "
128     IFS=§
129    
130     while read pathto posix user group
131     do
132     [ -z "${pathto}" ] && continue
133     [[ ${VERBOSE} = on ]] && echo -e "\t>>> DIR: ${MROOT}${pathto}"
134    
135    
136     # monitors /etc/env.d -> env-rebuild
137     [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
138    
139     # monitors /usr/share/info -> info-rebuild
140     [[ ${pathto} = /usr/share/info ]] && export MAGE_INFO_REBUILD=true
141    
142     install -m "${posix}" -o "${user}" -g "${group}" -d "${MROOT}${pathto}"
143     done < ${BUILDDIR}/${pkgname}/.dirs
144    
145     # very important: unsetting the '§' fieldseperator
146     IFS=$'\n'
147     }
148    
149    
150     ###################################################
151     # function install_files #
152     # install_files $PKGNAME #
153     ###################################################
154     install_files()
155     {
156    
157     local pkgname="$1"
158     local pathto
159     local posix
160     local user
161     local group
162     local mtime
163     local md5sum
164    
165     local retval
166     local counter
167     local filename
168     local dest_dirname
169     local dest_protected
170     local IFS
171    
172     # sanity checks; abort if not given
173     [ -z "${pkgname}" ] && die "install_files() \$pkgname not given."
174    
175     # check needed global vars
176     [ -z "${BUILDDIR}" ] && die "install_files() \$BUILDDIR not set."
177    
178     [ ! -f ${BUILDDIR}/${pkgname}/.files ] && die "install_files() .files not found"
179    
180     # delete old files
181     [ -f ${BUILDDIR}/${pkgname}/.files_fixed ] && rm ${BUILDDIR}/${pkgname}/.files_fixed
182    
183     # sets fieldseperator to "§" instead of " "
184     IFS=§
185    
186     while read pathto posix user group mtime md5sum
187     do
188     [ -z "${pathto}" ] && continue
189    
190     # final destination dir of file ${pathto}
191     dest_dirname="$(dirname "${MROOT}${pathto}")"
192    
193     ### small hotfix fix ###
194     [ ! -d "${dest_dirname}" ] && install -d "${dest_dirname}"
195    
196     # check if the file is config_protected
197     # ${MROOT} will automatically added if set !!
198     is_config_protected "${pathto}"
199     retval="$?"
200    
201     # 0 - not protected #
202     # 1 - error #
203     # 2 - protected #
204     # 3 - protected but masked #
205    
206     case ${retval} in
207     # file is not protected - (over)write it
208     0|3)
209     [[ ${VERBOSE} = on ]] && echo -e "\t>>> FILE: ${MROOT}${pathto}"
210     install -m "${posix}" -o "${user}" -g "${group}" \
211     ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
212     "${MROOT}${pathto}"
213    
214     # fix mtime and db
215     fix_descriptor ${pkgname}/.files \
216     "${pathto}" \
217     "${posix}" \
218     "${user}" \
219     "${group}" \
220     "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
221     "${MROOT}${pathto}")" \
222     "${md5sum}"
223     ;;
224    
225     # file is protected, write backup file
226     2)
227     if [[ ${VERBOSE} = on ]]
228     then
229     echo -en "${COLRED}"
230     echo -n "! prot "
231     echo -en "${COLDEFAULT}"
232     echo " === FILE: ${MROOT}${pathto}"
233     fi
234     filename="$(basename "${pathto}")"
235     counter=$(count_protected_files "${pathto}")
236     dest_protected="${dest_dirname}/._cfg${counter}_${filename}"
237     install -m "${posix}" -o "${user}" -g "${group}" \
238     ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
239     "${dest_protected}"
240    
241     # fix mtime and db
242     fix_descriptor ${pkgname}/.files \
243     "${pathto}" \
244     "${posix}" \
245     "${user}" \
246     "${group}" \
247     "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
248     "${dest_protected}")" \
249     "${md5sum}"
250    
251     # update global MAGE_PROTECT_COUNTER
252     (( MAGE_PROTECT_COUNTER++ ))
253     export MAGE_PROTECT_COUNTER
254     ;;
255     esac
256     done < ${BUILDDIR}/${pkgname}/.files
257    
258     # now copy the fixed file over the old one
259     [ -f ${BUILDDIR}/${pkgname}/.files_fixed ] && \
260     cp ${BUILDDIR}/${pkgname}/.files{_fixed,}
261    
262     # very important: unsetting the '§' fieldseperator
263     IFS=$'\n'
264     }
265    
266    
267     ###################################################
268     # function install_symlinks #
269     # install_symlinks $PKGNAME #
270     ###################################################
271     install_symlinks()
272     {
273     local pkgname="$1"
274     local pathto
275     local posix
276     local link
277     local mtime
278     local IFS
279    
280     # sanity checks; abort if not given
281     [ -z "${pkgname}" ] && die "install_symlinks() \$pkgname not given."
282    
283     # check needed global vars
284     [ -z "${BUILDDIR}" ] && die "install_symlinks() \$BUILDDIR not set."
285    
286     [ ! -f ${BUILDDIR}/${pkgname}/.symlinks ] && die "install_symlinks() .symlinks not found"
287    
288     # delete old files
289     [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && rm ${BUILDDIR}/${pkgname}/.symlinks_fixed
290    
291     # sets fieldseperator to "§" instead of " "
292     IFS=§
293    
294     while read pathto posix link mtime
295     do
296     [ -z "${pathto}" ] && continue
297     [[ ${VERBOSE} = on ]] && echo -e "\t>>> LINK: ${MROOT}${pathto}"
298    
299     ln -snf "${link}" "${MROOT}${pathto}"
300    
301     # fix mtime and db
302     fix_descriptor ${pkgname}/.symlinks \
303     "${pathto}" \
304     "${posix}" \
305     "${link}" \
306     "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
307     "${MROOT}${pathto}")"
308    
309     done < ${BUILDDIR}/${pkgname}/.symlinks
310    
311     # now copy the fixed file over the old one
312     [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \
313     cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}
314    
315     # very important: unsetting the '§' fieldseperator
316     IFS=$'\n'
317     }
318    
319    
320     ###################################################
321     # function install_blockdevices #
322     # install_blockdevices $PKGNAME #
323     ###################################################
324     install_blockdevices()
325     {
326     local pkgname="$1"
327     local pathto
328     local posix
329     local IFS
330    
331     # sanity checks; abort if not given
332     [ -z "${pkgname}" ] && die "install_blockdevices() \$pkgname not given."
333    
334     # check needed global vars
335     [ -z "${BUILDDIR}" ] && die "install_blockdevices() \$BUILDDIR not set."
336    
337     [ ! -f ${BUILDDIR}/${pkgname}/.pipes ] && die "install_blockdevices() .pipes not found"
338    
339     # sets fieldseperator to "§" instead of " "
340     IFS=§
341    
342     while read pathto posix
343     do
344     [ -z "${pathto}" ] && continue
345     [[ ${VERBOSE} = on ]] && echo -e "\t>>> PIPE: ${MROOT}${pathto}"
346    
347     mkfifo -m "${posix}" "${MROOT}$pathto"
348     done < ${BUILDDIR}/${pkgname}/.pipes
349    
350     # very important: unsetting the '§' fieldseperator
351     IFS=$'\n'
352     }
353    
354    
355     ###################################################
356     # function install_characterdevices #
357     # install_characterdevices $PKGNAME #
358     ###################################################
359     install_characterdevices()
360     {
361     local pkgname="$1"
362     local pathto
363     local posix
364 niro 312 local major
365     local minor
366 niro 226 local IFS
367    
368     # sanity checks; abort if not given
369     [ -z "${pkgname}" ] && die "install_characterdevices() \$pkgname not given."
370    
371     # check needed global vars
372     [ -z "${BUILDDIR}" ] && die "install_characterdevices() \$BUILDDIR not set."
373    
374     [ ! -f ${BUILDDIR}/${pkgname}/.char ] && die "install_characterdevices() .char not found"
375    
376     # sets fieldseperator to "§" instead of " "
377     IFS=§
378    
379 niro 312 while read pathto posix major minor
380 niro 226 do
381     [ -z "${pathto}" ] && continue
382     [[ ${VERBOSE} = on ]] && echo -e "\t>>> CHAR: ${MROOT}${pathto}"
383    
384 niro 314 mknod -m ${posix} "${MROOT}${pathto}" c ${major} ${minor}
385 niro 226 done < ${BUILDDIR}/${pkgname}/.char
386    
387     # very important: unsetting the '§' fieldseperator
388     IFS=$'\n'
389     }
390    
391    
392     ###################################################
393     # function build_doinstall #
394     # build_doinstall $PKGNAME #
395     # NOTE: this is an wrapper do install packages #
396     ###################################################
397     build_doinstall()
398     {
399     local pkgname="$1"
400    
401     # sanity checks; abort if not given
402     [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."
403    
404     # this is only a wrapper
405    
406     # NOTE:
407     # !! we use § as field seperator !!
408     # doing so prevent us to get errors by filenames with spaces
409    
410     # create a new mtime reference file
411     touch ${BUILDDIR}/${pkgname}/.mtime
412    
413     install_directories ${pkgname} || die "install directories ${pkgname}"
414     install_files ${pkgname} || die "install files ${pkgname}"
415     install_symlinks ${pkgname} || die "install symlinks ${pkgname}"
416     install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"
417     install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"
418     }
419    
420    
421     ###################################################
422     # function install_database_entry #
423     # install_database_entry $PKGNAME $PKGTYPE #
424     # PKGTYPE can be "virtual", "sources" or nothing #
425     ###################################################
426     install_database_entry()
427     {
428     local pcat
429     local pname
430     local pver
431     local pbuild
432     local pkgtype
433     local pkgname
434     local magefile
435     local dbrecorddir
436     local provide
437 niro 273 local i
438 niro 226
439     # very basic getops
440     for i in $*
441     do
442     case $1 in
443     --pcat|-c) shift; pcat="$1" ;;
444     --pname|-n) shift; pname="$1" ;;
445     --pver|-v) shift; pver="$1" ;;
446     --pbuild|-b) shift; pbuild="$1" ;;
447     --pkgname|-a) shift; pkgname="$1" ;;
448     --pkgtype|-t) shift; pkgtype="$1" ;;
449     esac
450     shift
451     done
452    
453     # sanity checks; abort if not given
454     [ -z "${pcat}" ] && die "install_database_entry() \$pcat not given."
455     [ -z "${pname}" ] && die "install_database_entry() \$pname not given."
456     [ -z "${pver}" ] && die "install_database_entry() \$pver not given."
457     [ -z "${pbuild}" ] && die "install_database_entry() \$pbuild not given."
458     [ -z "${pkgname}" ] && die "install_database_entry() \$pkgname not given."
459    
460     # check needed global vars
461     [ -z "${MAGEDIR}" ] && die "install_database_entry() \$MAGEDIR not set."
462     [ -z "${INSTALLDB}" ] && die "install_database_entry() \$INSTALLDB not set."
463    
464     # set needed vars
465     magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
466     dbrecorddir="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}"
467    
468     # abort if mage file not exists
469     [ ! -f ${magefile} ] && die "install_database_entry() ${magefile} not exist."
470    
471     # add package to database
472     install -d ${dbrecorddir}
473    
474     # install mage-file to database
475     install -m 0644 -o root -g root ${magefile} ${dbrecorddir}
476    
477     # create fake file descriptors
478     # used by virtual and source packages
479     for i in .dirs .symlinks .files .pipes .char
480     do
481     touch ${dbrecorddir}/${i}
482     done
483    
484     # put the category to database
485     echo ${pcat} > ${dbrecorddir}/.categorie
486    
487     # now install PKGTYPE specific files
488     case ${pkgtype} in
489     virtual) touch ${dbrecorddir}/.virtual ;;
490     sources) touch ${dbrecorddir}/.sources ;;
491     *)
492     # !move! .mtime to database (only mv modifies not the mtime!!)
493     mv ${BUILDDIR}/${pkgname}/.mtime ${dbrecorddir}/.mtime
494    
495     # normal packages needs these files
496     local i
497     for i in .char .dirs .files .pipes .symlinks
498     do
499     install -m 0644 ${BUILDDIR}/${pkgname}/${i} \
500     ${dbrecorddir}/${i}
501     done
502     ;;
503     esac
504    
505     # last but not least register virtuals
506     provide="$(get_value_from_magefile PROVIDE ${magefile})"
507     if [ -n "${provide}" ]
508     then
509 niro 273 for i in ${provide}
510     do
511     virtuals_add "${i}" "${pcat}/${pname}"
512     done
513 niro 226 fi
514     }
515    
516    
517     ###################################################
518     # function remove_database_entry #
519     # remove_database_entry $PKGNAME $PKGTYPE #
520     # PKGTYPE can be "virtual", "sources" or nothing #
521     ###################################################
522     remove_database_entry()
523     {
524     local pcat
525     local pname
526     local pver
527     local pbuild
528     local magefile
529     local dbrecorddir
530     local provide
531 niro 273 local i
532 niro 226
533     # very basic getops
534     for i in $*
535     do
536     case $1 in
537     --pcat|-c) shift; pcat="$1" ;;
538     --pname|-n) shift; pname="$1" ;;
539     --pver|-v) shift; pver="$1" ;;
540     --pbuild|-b) shift; pbuild="$1" ;;
541     esac
542     shift
543     done
544    
545     # sanity checks; abort if not given
546     [ -z "${pcat}" ] && die "remove_database_entry() \$pcat not given."
547     [ -z "${pname}" ] && die "remove_database_entry() \$pname not given."
548     [ -z "${pver}" ] && die "remove_database_entry() \$pver not given."
549     [ -z "${pbuild}" ] && die "remove_database_entry() \$pbuild not given."
550    
551     # check needed global vars
552     [ -z "${INSTALLDB}" ] && die "remove_database_entry() \$INSTALLDB not set."
553    
554     # set needed vars
555     magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
556     dbrecorddir="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}"
557    
558     # abort if mage file not exists
559     [ ! -f ${magefile} ] && die "remove_database_entry() ${magefile} not exist."
560    
561 niro 294 # remove virtuals only if no other exist
562     if [[ $(count_installed_pkgs --pcat ${pcat} --pname ${pname}) -le 1 ]]
563 niro 226 then
564 niro 294 # first unregister virtuals
565     provide="$(get_value_from_magefile PROVIDE ${magefile})"
566     if [ -n "${provide}" ]
567     then
568     for i in ${provide}
569     do
570     virtuals_del "${i}" "${pcat}/${pname}"
571     done
572     fi
573 niro 226 fi
574    
575     # removes database entry
576     if [ -d ${dbrecorddir} ]
577     then
578     rm -rf ${dbrecorddir}
579     fi
580     }
581    
582 niro 294 # get the number of installed packages
583     count_installed_pkgs()
584     {
585     local pcat
586     local pname
587     local pkg
588     local i
589 niro 226
590 niro 294 # very basic getops
591     for i in $*
592     do
593     case $1 in
594     --pcat|-c) shift; pcat="$1" ;;
595     --pname|-n) shift; pname="$1" ;;
596     esac
597     shift
598     done
599    
600     # sanity checks; abort if not given
601     [ -z "${pcat}" ] && die "pkg_count() \$pcat not given."
602     [ -z "${pname}" ] && die "pkg_count() \$pname not given."
603    
604     declare -i i=0
605     for pkg in $(get_uninstall_candidates --pcat ${pcat} --pname ${pname})
606     do
607     (( i++ ))
608     #echo "$i ${pkg}"
609     done
610    
611     # return the value
612     echo "${i}"
613     }
614    
615    
616 niro 226 ###################################################
617     # function compare_mtime #
618     # compare_mtime $pcat/$PKGNAME /path/to/file #
619     # #
620     # returns: #
621     # 0=delete me #
622     # 1=keep me #
623     # #
624     # compares mtime of given files in packages #
625     ###################################################
626     compare_mtime()
627     {
628     local pfull="$1"
629     local pathto="$2"
630     local mtime
631     local pcat
632     local x
633    
634     mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"
635    
636     # if $pathto is a symlink than compare linked binary
637     if [ -L "${MROOT}${pathto}" ]
638     then
639     # readlink -f resolves full path of linked file
640     x="$(readlink -f "${MROOT}${pathto}")"
641    
642     # abort if target does not exists
643     # we keep safe here, theoretically the link can removed
644     [ ! -e "${x}" ] && return 1
645    
646     x=$(stat -c %Y "${x}")
647     else
648     x=$(stat -c %Y "${MROOT}${pathto}")
649     fi
650    
651     [[ ${mtime} = ${x} ]] && return 0
652    
653     # echo "keep me : ${pathto}"
654     return 1
655     }
656    
657    
658     ###################################################
659     # function remove_symlinks #
660     # remove_symlinks $PKGNAME #
661     ###################################################
662     remove_symlinks()
663     {
664     local pathto
665     local posix
666     local link
667     local mtime
668     local IFS
669     local retval
670     local pcat
671     local pname
672     local pver
673     local pbuild
674     local i
675     local pfull
676    
677     IFS=$'\n'
678    
679     # very basic getops
680     for i in $*
681     do
682     case $1 in
683     --pcat|-c) shift; pcat="$1" ;;
684     --pname|-n) shift; pname="$1" ;;
685     --pver|-v) shift; pver="$1" ;;
686     --pbuild|-b) shift; pbuild="$1" ;;
687     esac
688     shift
689     done
690    
691     # sanity checks; abort if not given
692     [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
693     [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
694     [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
695     [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
696     pfull="${pcat}/${pname}-${pver}-${pbuild}"
697    
698     # check needed global vars
699     [ -z "${BUILDDIR}" ] && die "remove_symlinks() \$BUILDDIR not set."
700    
701     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.symlinks ] && die "remove_symlinks() .symlinks not found"
702    
703     # sets fieldseperator to "§" instead of " "
704     IFS=§
705    
706     while read pathto posix link mtime
707     do
708     [ -z "${pathto}" ] && continue
709     if [ ! -L "${MROOT}${pathto}" ]
710     then
711     [[ ${VERBOSE} = on ]] && \
712     echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"
713     continue
714     fi
715    
716     # *no* ${MROOT}, will be set internal
717     compare_mtime "${pfull}" "${pathto}"
718     retval=$?
719     # 0=delete me #
720     # 1=keep me #
721     case ${retval} in
722     0)
723     [[ ${VERBOSE} = on ]] && echo -e "\t<<< LINK: ${MROOT}${pathto}"
724     rm "${MROOT}${pathto}"
725     ;;
726    
727     1)
728     [[ ${VERBOSE} = on ]] && \
729     echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"
730     ;;
731     esac
732     done < ${MROOT}${INSTALLDB}/${pfull}/.symlinks
733    
734     # very important: unsetting the '§' fieldseperator
735     IFS=$'\n'
736     }
737    
738    
739     ###################################################
740     # function remove_files #
741     # remove_files $PKGNAME #
742     ###################################################
743     remove_files()
744     {
745     local pathto
746     local posix
747     local user
748     local group
749     local mtime
750     local md5sum
751     local IFS
752     local retval
753     local pcat
754     local pname
755     local pver
756     local pbuild
757     local i
758     local pfull
759    
760     IFS=$'\n'
761    
762     # very basic getops
763     for i in $*
764     do
765     case $1 in
766     --pcat|-c) shift; pcat="$1" ;;
767     --pname|-n) shift; pname="$1" ;;
768     --pver|-v) shift; pver="$1" ;;
769     --pbuild|-b) shift; pbuild="$1" ;;
770     esac
771     shift
772     done
773    
774     # sanity checks; abort if not given
775     [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
776     [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
777     [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
778     [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
779     pfull="${pcat}/${pname}-${pver}-${pbuild}"
780    
781     # check needed global vars
782     [ -z "${BUILDDIR}" ] && die "remove_files() \$BUILDDIR not set."
783    
784     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.files ] && die "remove_files() .files not found"
785    
786     # sets fieldseperator to "§" instead of " "
787     IFS=§
788    
789     while read pathto posix user group mtime md5sum
790     do
791     [ -z "${pathto}" ] && continue
792    
793 niro 240 if [ ! -e "${MROOT}${pathto}" ]
794 niro 226 then
795     [[ ${VERBOSE} = on ]] && \
796     echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"
797     continue
798     fi
799    
800     # *no* ${MROOT}, will be set internal
801     compare_mtime "${pfull}" "${pathto}"
802     retval=$?
803     # 0=delete me #
804     # 1=keep me #
805     case ${retval} in
806     0)
807 niro 280 # check if the file is config_protected
808     # ${MROOT} will automatically added if set !!
809     is_config_protected "${pathto}"
810     retval="$?"
811    
812     # 0 - not protected #
813     # 1 - error #
814     # 2 - protected #
815     # 3 - protected but masked #
816    
817     case ${retval} in
818     # file is not protected - delete it
819     0|3)
820     [[ ${VERBOSE} = on ]] && echo -e "\t<<< FILE: ${MROOT}${pathto}"
821     rm "${MROOT}${pathto}"
822     ;;
823    
824     # file is protected, do not delete
825     2)
826     if [[ ${VERBOSE} = on ]]
827     then
828     echo -en "${COLRED}"
829     echo -n "! prot "
830     echo -en "${COLDEFAULT}"
831     echo " === FILE: ${MROOT}${pathto}"
832     fi
833     ;;
834     esac
835 niro 226 ;;
836     1)
837     [[ ${VERBOSE} = on ]] && \
838     echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"
839     ;;
840     esac
841     done < ${MROOT}${INSTALLDB}/${pfull}/.files
842    
843     # very important: unsetting the '§' fieldseperator
844     IFS=$'\n'
845     }
846    
847    
848     ###################################################
849     # function remove_blockdevices #
850     # remove_blockdevices $PKGNAME #
851     ###################################################
852     remove_blockdevices()
853     {
854     local pathto
855     local posix
856     local IFS
857     local pcat
858     local pname
859     local pver
860     local pbuild
861     local i
862     local pfull
863    
864     IFS=$'\n'
865    
866     # very basic getops
867     for i in $*
868     do
869     case $1 in
870     --pcat|-c) shift; pcat="$1" ;;
871     --pname|-n) shift; pname="$1" ;;
872     --pver|-v) shift; pver="$1" ;;
873     --pbuild|-b) shift; pbuild="$1" ;;
874     esac
875     shift
876     done
877    
878     # sanity checks; abort if not given
879     [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
880     [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
881     [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
882     [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
883     pfull="${pcat}/${pname}-${pver}-${pbuild}"
884    
885     # check needed global vars
886     [ -z "${BUILDDIR}" ] && die "remove_blockdevices() \$BUILDDIR not set."
887    
888     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.pipes ] && die "remove_blockdevices() .pipes not found"
889    
890     # sets fieldseperator to "§" instead of " "
891     IFS=§
892    
893     while read pathto posix
894     do
895     [ -z "${pathto}" ] && continue
896    
897     [[ ${VERBOSE} = on ]] && echo -e "\t<<< PIPE: ${MROOT}${pathto}"
898     rm "${MROOT}${pathto}"
899     done < ${MROOT}${INSTALLDB}/${pfull}/.pipes
900    
901     # very important: unsetting the '§' fieldseperator
902     IFS=$'\n'
903     }
904    
905    
906     ###################################################
907     # function remove_characterdevices #
908     # remove_characterdevices $PKGNAME #
909     ###################################################
910     remove_characterdevices()
911     {
912     local pathto
913     local posix
914     local IFS
915     local pcat
916     local pname
917     local pver
918     local pbuild
919     local i
920     local pfull
921    
922     IFS=$'\n'
923    
924     # very basic getops
925     for i in $*
926     do
927     case $1 in
928     --pcat|-c) shift; pcat="$1" ;;
929     --pname|-n) shift; pname="$1" ;;
930     --pver|-v) shift; pver="$1" ;;
931     --pbuild|-b) shift; pbuild="$1" ;;
932     esac
933     shift
934     done
935    
936     # sanity checks; abort if not given
937     [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
938     [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
939     [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
940     [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
941     pfull="${pcat}/${pname}-${pver}-${pbuild}"
942    
943     # check needed global vars
944     [ -z "${BUILDDIR}" ] && die "remove_characterdevices() \$BUILDDIR not set."
945    
946     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_characterdevices() .char not found"
947    
948     # sets fieldseperator to "§" instead of " "
949     IFS=§
950    
951     while read pathto posix
952     do
953     [ -z "${pathto}" ] && continue
954    
955     [[ ${VERBOSE} = on ]] && echo -e "\t<<< CHAR: ${MROOT}${pathto}"
956     rm "${MROOT}${pathto}"
957     done < ${MROOT}${INSTALLDB}/${pfull}/.char
958    
959     # very important: unsetting the '§' fieldseperator
960     IFS=$'\n'
961     }
962    
963    
964     ###################################################
965     # function remove_direcories #
966     # remove_direcories $PKGNAME #
967     ###################################################
968     remove_directories()
969     {
970     local pathto
971     local posix
972     local IFS
973     local pcat
974     local pname
975     local pver
976     local pbuild
977     local i
978     local pfull
979    
980     IFS=$'\n'
981    
982     # very basic getops
983     for i in $*
984     do
985     case $1 in
986     --pcat|-c) shift; pcat="$1" ;;
987     --pname|-n) shift; pname="$1" ;;
988     --pver|-v) shift; pver="$1" ;;
989     --pbuild|-b) shift; pbuild="$1" ;;
990     esac
991     shift
992     done
993    
994     # sanity checks; abort if not given
995     [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
996     [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
997     [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
998     [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
999     pfull="${pcat}/${pname}-${pver}-${pbuild}"
1000    
1001     # check needed global vars
1002     [ -z "${BUILDDIR}" ] && die "remove_directories() \$BUILDDIR not set."
1003    
1004     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_directories() .dirs not found"
1005    
1006     # sets fieldseperator to "§" instead of " "
1007     IFS=§
1008    
1009 niro 240 # reversed order is mandatory !
1010     tac ${MROOT}${INSTALLDB}/${pfull}/.dirs | while read pathto posix
1011 niro 226 do
1012     [ -z "${pathto}" ] && continue
1013    
1014     if [ ! -d "${MROOT}${pathto}" ]
1015     then
1016     [[ ${VERBOSE} = on ]] && \
1017     echo -e "${COLRED}! exist${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1018     continue
1019     fi
1020    
1021     # exclude .keep directories
1022     if [ -f "${MROOT}${pathto}/.keep" ]
1023     then
1024     [[ ${VERBOSE} = on ]] && \
1025 niro 240 echo -e "${COLRED}! .keep${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1026 niro 226 continue
1027     fi
1028    
1029     # monitors /etc/env.d -> env-rebuild
1030     [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
1031    
1032     # monitors /usr/share/info -> info-rebuild
1033     [[ ${pathto} = /usr/share/info ]] && export MAGE_INFO_REBUILD=true
1034    
1035     if rmdir "${MROOT}${pathto}" &> /dev/null
1036     then
1037     [[ ${VERBOSE} = on ]] && echo -e "\t<<< DIR: ${MROOT}${pathto}"
1038     else
1039     [[ ${VERBOSE} = on ]] && \
1040     echo -e "${COLRED}! empty${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1041     fi
1042 niro 240 done
1043 niro 226
1044     # very important: unsetting the '§' fieldseperator
1045     IFS=$'\n'
1046     }
1047    
1048    
1049     ###################################################
1050     # function build_douninstall #
1051     # build_douninstall $PKGNAME #
1052     # NOTE: this is an wrapper do remove packages #
1053     ###################################################
1054     build_douninstall()
1055     {
1056     local pcat
1057     local pname
1058     local pver
1059     local pbuild
1060     local i
1061    
1062     # very basic getops
1063     for i in $*
1064     do
1065     case $1 in
1066     --pcat|-c) shift; pcat="$1" ;;
1067     --pname|-n) shift; pname="$1" ;;
1068     --pver|-v) shift; pver="$1" ;;
1069     --pbuild|-b) shift; pbuild="$1" ;;
1070     esac
1071     shift
1072     done
1073    
1074     # sanity checks; abort if not given
1075     [ -z "${pcat}" ] && die "build_douninstall() \$pcat not given."
1076     [ -z "${pname}" ] && die "build_douninstall() \$pname not given."
1077     [ -z "${pver}" ] && die "build_douninstall() \$pver not given."
1078     [ -z "${pbuild}" ] && die "build_douninstall() \$pbuild not given."
1079    
1080     # this is only a wrapper
1081    
1082     # NOTE:
1083     # !! we use § as field seperator !!
1084     # doing so prevent us to get errors by filenames with spaces
1085    
1086     for i in symlinks files blockdevices characterdevices directories
1087     do
1088     remove_${i} \
1089     --pcat "${pcat}" \
1090     --pname "${pname}" \
1091     --pver "${pver}" \
1092     --pbuild "${pbuild}" \
1093     || die "remove ${i} ${pcat}/${pname}-${pver}-${pbuild}"
1094     done
1095     }
1096    
1097     # fetch_packages /path/to/mage/file1 /path/to/mage/file2
1098     fetch_packages()
1099     {
1100     local list="$@"
1101     local pkg
1102     local mirr
1103     local magefile
1104     local md5file
1105     local opt
1106     local count_current
1107     local count_total
1108    
1109     [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your /etc/mage.rc."
1110    
1111     # get count of total packages
1112     declare -i count_current=0
1113     declare -i count_total=0
1114    
1115     for i in ${list}; do (( count_total++ )); done
1116    
1117     for magefile in ${list}
1118     do
1119     pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
1120     pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
1121    
1122     (( count_current++ ))
1123     xtitle "[ (${count_current}/${count_total}) Fetching ${pkg} ]"
1124    
1125     # abort on virtual pkg
1126     if [[ ${pkgtype} = virtual ]]
1127     then
1128     echo -ne " ${COLBLUE}---${COLDEFAULT}"
1129     echo " !fetch virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
1130     continue
1131     fi
1132    
1133     # abort on sources pkg
1134     if [[ ${pkgtype} = sources ]]
1135     then
1136     echo -ne " ${COLBLUE}---${COLDEFAULT}"
1137     echo " !fetch sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
1138     continue
1139     fi
1140    
1141     # abort if already exist
1142     if [ -f ${PKGDIR}/${pkg} ]
1143     then
1144     echo -ne " ${COLBLUE}***${COLDEFAULT}"
1145     echo " fetch complete (${count_current}/${count_total}): ${pkg} ... "
1146     continue
1147     fi
1148    
1149     for mirr in ${MIRRORS}
1150     do
1151     echo -ne " ${COLBLUE}***${COLDEFAULT}"
1152     #echo -e " fetching (${count_current}/${count_total}): ${mirr}/${pkg} ... "
1153     echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "
1154     [[ ${VERBOSE} = off ]] && opt="--quiet"
1155     wget \
1156     --passive-ftp \
1157     --tries 3 \
1158     --continue \
1159     --progress bar \
1160     --directory-prefix=${PKGDIR} \
1161 niro 286 ${opt} ${mirr}/${PACKAGES_SERVER_PATH}/${pkg}
1162 niro 226 if [[ $? = 0 ]]
1163     then
1164     break
1165     else
1166     continue
1167     fi
1168     done
1169    
1170     if [ ! -f ${PKGDIR}/${pkg} ]
1171     then
1172     die "Could not download ${pkg}"
1173     fi
1174     done
1175    
1176     # add a crlf for a better view
1177     if [ ${count_total} -gt 1 ]; then echo; fi
1178     }
1179    
1180     syncmage()
1181     {
1182     if [ -z "${RSYNC}" ]
1183     then
1184     die "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."
1185     fi
1186    
1187     local i
1188     for i in ${RSYNC}
1189     do
1190     rsync \
1191     --recursive \
1192     --links \
1193     --perms \
1194     --times \
1195     --devices \
1196     --timeout=600 \
1197     --verbose \
1198     --compress \
1199     --progress \
1200     --stats \
1201     --delete \
1202     --delete-after \
1203     ${i} ${MAGEDIR}
1204     if [[ $? = 0 ]]
1205     then
1206     break
1207     else
1208     continue
1209     fi
1210     done
1211    
1212     # clean up backup files (foo~)
1213     find ${MAGEDIR} -name *~ -exec rm '{}' ';'
1214    
1215     # check if an newer mage version is available
1216     is_newer_mage_version_available
1217     }
1218    
1219     cleanpkg()
1220     {
1221     if [ -d "${PKGDIR}" ]
1222     then
1223     echo -n "Removing downloaded packages... "
1224     rm -rf ${PKGDIR}/*
1225     echo "done."
1226     fi
1227     }
1228    
1229     xtitle()
1230     {
1231     if [[ ${TERM} = xterm ]]
1232     then
1233     echo -ne "\033]0;Mage: $1\007"
1234     fi
1235     return 0
1236     }
1237    
1238    
1239     xtitleclean()
1240     {
1241     if [[ ${TERM} = xterm ]]
1242     then
1243     echo -ne "\033]0;\007"
1244     fi
1245     return 0
1246     }
1247    
1248    
1249     # cuts full pathnames or versioniezed names down to basename
1250     choppkgname()
1251     {
1252     #we want this only if full name was used
1253     if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1254     then
1255     #cuts ARCH and PBUILD
1256     #ARCH comes from /etc/mage.rc
1257     MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
1258    
1259     #cuts version number
1260     MAGENAME=$(basename ${MAGENAME%-*} .mage)
1261     fi
1262     }
1263    
1264     # get_categorie $PNAME, returns CATEGORIE
1265     # $1=pname
1266     # ret 0=ok, 1=not_found
1267     pname2pcat()
1268     {
1269     local pname="$1"
1270     local repo="$2"
1271     local pcat
1272     local categorie
1273    
1274     for pcat in ${MAGEDIR}/*
1275     do
1276     if [ -d ${pcat}/${pname} ]
1277     then
1278     categorie=$(basename ${pcat})
1279     fi
1280     done
1281    
1282     echo "${categorie}"
1283     }
1284    
1285     # check_stable_package /path/to/foo.mage
1286     # returns 0=stable 1=unstable
1287     check_stable_package()
1288     {
1289     local STATE
1290     STATE="$(get_value_from_magefile STATE "$1")"
1291    
1292     # state testing
1293 niro 286 if [[ ${USE_TESTING} = true ]] || [[ ${MAGE_DISTRIBUTION} = testing ]]
1294 niro 226 then
1295     case ${STATE} in
1296     testing|stable) return 0 ;;
1297     *) return 1 ;;
1298     esac
1299     fi
1300    
1301     # state unstable
1302 niro 286 if [[ ${USE_UNSTABLE} = true ]] || [[ ${MAGE_DISTRIBUTION} = unstable ]]
1303 niro 226 then
1304     case ${STATE} in
1305     unstable|testing|stable) return 0 ;;
1306     *) return 1 ;;
1307     esac
1308     fi
1309    
1310     # no use_state given = stable
1311     case ${STATE} in
1312     stable) return 0 ;;
1313     *) return 1 ;;
1314     esac
1315     }
1316    
1317    
1318     # get_highest_magefile ${PCAT} ${PNAME}
1319     # fake at moment returns only stable pkgs (must set to be one)
1320     # return $HIGHEST_MAGEFILE
1321     get_highest_magefile()
1322     {
1323     local HIGHEST_MAGEFILE
1324     local PCAT="$1"
1325     local PNAME="$2"
1326     local magefile
1327    
1328     for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*)
1329     do
1330     # we exclude subdirs (for stuff like a md5sum dir)
1331     [ -d ${magefile} ] && continue
1332     if check_stable_package ${magefile}
1333     then
1334     HIGHEST_MAGEFILE=${magefile}
1335     #for debug only
1336     [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1337     fi
1338     done
1339    
1340     # stop here if HIGHEST_MAGEFILE is zero
1341     # this package must be unstable or old
1342     if [ -z "${HIGHEST_MAGEFILE}" ]
1343     then
1344     echo
1345     echo -n "All packages named "
1346     echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1347     echo -n " are marked "
1348     echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1349     echo "."
1350     echo "You need to declare USE_UNSTABLE=true to install this."
1351     echo
1352     echo "Example:"
1353     echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1354     echo
1355     echo "Be warned that these packages are not stable and may cause serious problems."
1356     echo "You should know what you are doing, so don't complain about any damage."
1357     echo
1358     return 1
1359     fi
1360    
1361     echo "${HIGHEST_MAGEFILE}"
1362     return 0
1363     }
1364    
1365    
1366     ###################################################
1367     # function is_config_protected #
1368     # is_config_protected /path/to/file #
1369     # #
1370     # returns: #
1371     # 0 - not protected #
1372     # 1 - error #
1373     # 2 - protected #
1374     # 3 - protected but masked #
1375     # #
1376     ###################################################
1377     is_config_protected()
1378     {
1379     local EXPFILE
1380     local TEST
1381     local PROTECTED
1382     local IFS
1383    
1384     EXPFILE="${MROOT}$1"
1385    
1386     # file does not exist; it can be written
1387     [ ! -e ${EXPFILE} ] && return 0
1388    
1389     # to be safe; it may be '§'
1390     IFS=' '
1391    
1392     # check ob in config protect
1393     for i in ${CONFIG_PROTECT}
1394     do
1395     # ersetzen von $i nur wenn am anfang der variable
1396     TEST="${EXPFILE/#${MROOT}${i}/Protected}"
1397     if [ "${TEST}" != "${EXPFILE}" ]
1398     then
1399     # setzen das es protected ist
1400     PROTECTED=TRUE
1401    
1402     # check ob nicht doch maskiert
1403     for x in ${CONFIG_PROTECT_MASK}
1404     do
1405     TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"
1406     if [ "${TEST}" != "${EXPFILE}" ]
1407     then
1408     PROTECTED=MASKED
1409     fi
1410     done
1411     fi
1412     done
1413    
1414     unset IFS
1415    
1416     case ${PROTECTED} in
1417     TRUE)
1418     #echo "I'm protected"
1419     return 2
1420     ;;
1421     MASKED)
1422     #echo "I'm protected, but masked - delete me"
1423     return 3
1424     ;;
1425     *)
1426     #echo "delete me"
1427     return 0
1428     ;;
1429     esac
1430     }
1431    
1432    
1433     ###################################################
1434     # function count_protected_files #
1435     # count_protected_files /path/to/file #
1436     # #
1437     # note: prints number of protected files #
1438     # exp: 0012 #
1439     ###################################################
1440     count_protected_files()
1441     {
1442     ${MLIBDIR}/writeprotected "$1"
1443     }
1444    
1445     # call with
1446     # 'get_uninstall_candidates (--pcat cat --protected pcat/pfull) --pname PNAME'
1447     # returns /path/to/magefile(s)
1448     get_uninstall_candidates()
1449     {
1450     local search_pname
1451     local pkg
1452     local pcat
1453     local pname
1454     local pver
1455     local pbuild
1456     local list
1457     local pcatdir
1458     local protected
1459    
1460     # very basic getops
1461     for i in $*
1462     do
1463     case $1 in
1464     --pcat|-c) shift; pcatdir="$1" ;;
1465     --pname|-n) shift; search_pname="$1" ;;
1466     --protected|-p) shift; protected="$1" ;;
1467     esac
1468     shift
1469     done
1470    
1471 niro 329 # it's not good to complain here about empty pnames; better to continue later anyway
1472     # # sanity checks; abort if not given
1473     # [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."
1474 niro 226
1475    
1476     # check needed global vars
1477     [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."
1478    
1479     # set pcatdir to '*' if empty
1480 niro 329 [ -z "${pcatdir}" ] && pcatdir='*'
1481 niro 226
1482     for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*
1483     do
1484     # abort if not a dir
1485     [ ! -d ${pkg} ] && continue
1486    
1487     pname="$(magename2pname ${pkg})"
1488    
1489     if [[ ${search_pname} = ${pname} ]]
1490     then
1491     pcat="$(magename2pcat ${pkg} installdb)"
1492     pver="$(magename2pver ${pkg})"
1493     pbuild="$(magename2pbuild ${pkg})"
1494    
1495     # exclude proteced
1496     [[ ${protected} = ${pcat}/${pname}-${pver}-${pbuild} ]] && continue
1497    
1498     list="${list} ${pcat}/${pname}-${pver}-${pbuild}"
1499     fi
1500     done
1501    
1502     echo "${list}"
1503     }
1504    
1505     # reads virtualdb file
1506     #$1 = virtualname; $2 commands: showpkgs, showline
1507     #return 0 == installed -> shows installed pkg as well
1508     #return 1 == not installed
1509     virtuals_read()
1510     {
1511     local virtualname="$1"
1512     local command="$2"
1513     local virtline
1514     local line x i
1515    
1516     # parse file to get virtual_name line
1517     IFS=$'\n'
1518     for line in $(< ${MROOT}${VIRTUALDB_FILE})
1519     do
1520     IFS=$' '
1521     for x in ${line}
1522     do
1523     if [[ ${x} = ${virtualname} ]]
1524     then
1525     virtline="${line}"
1526     [[ ${command} = showline ]] && echo "${line}"
1527     fi
1528     done
1529     IFS=$'\n'
1530     done
1531    
1532     unset IFS
1533    
1534     # now read the packages linked to VIRTUAL_NAME and output them
1535     if [ -n "${virtline}" ]
1536     then
1537     if [[ ${command} = showpkgs ]]
1538     then
1539     declare -i x=0
1540     for i in ${virtline}
1541     do
1542     if [ ${x} -ge 1 ]
1543     then
1544     echo "${i}"
1545     fi
1546     ((x++))
1547     done
1548     fi
1549     return 0
1550     fi
1551     return 1
1552     }
1553    
1554    
1555     #add pkg to virtualdb
1556     # $1 == virtualname $2= pkgname
1557     # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1558     virtuals_add()
1559     {
1560     local virtualname="$1"
1561     local pkgname="$2"
1562     local oldline
1563     local line i
1564     local installed_file
1565 niro 273 local OLDIFS
1566 niro 226
1567     if virtuals_read ${virtualname}
1568     then
1569 niro 329 # make sure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1570 niro 226 for i in $(virtuals_read ${virtualname} showpkgs)
1571     do
1572     if [[ ${i} = ${pkgname} ]]
1573     then
1574     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1575     echo "${pkgname} already linked as ${virtualname} ..."
1576     #return 3
1577     return 0
1578     fi
1579     done
1580    
1581     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1582     echo "updating ${virtualname} entry with ${pkgname} ..."
1583     oldline="$(virtuals_read ${virtualname} showline)"
1584    
1585     # make a backup
1586     mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old
1587    
1588 niro 273 OLDIFS="${IFS}"
1589 niro 226 IFS=$'\n'
1590     for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)
1591     do
1592     # if the right line, append ${pkgname}, else do nothing
1593     if [[ ${line} = ${oldline} ]]
1594     then
1595     echo "${line} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1596     else
1597     echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}
1598     fi
1599     done
1600 niro 273 # unset IFS
1601     IFS="${OLDIFS}"
1602 niro 226 else
1603 niro 273 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
1604 niro 226 echo "register ${pkgname} as ${virtualname} ..."
1605     echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1606     fi
1607    
1608     return 0
1609     }
1610    
1611     #deletes pakages from virtual database
1612     #$1 virtualname; $2 pkgname
1613     virtuals_del() {
1614    
1615 niro 273 local virtualname="$1"
1616     local pkgname="$2"
1617     local oldline
1618     local method
1619     local line i x
1620     local pkg_installed
1621     local OLDIFS
1622    
1623     # first check if exists
1624     if virtuals_read ${virtualname}
1625 niro 226 then
1626 niro 273 # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1627 niro 226 declare -i x=0
1628 niro 273 for i in $(virtuals_read ${virtualname} showpkgs)
1629 niro 226 do
1630 niro 273 if [[ ${i} = ${pkgname} ]]
1631 niro 226 then
1632 niro 273 pkg_installed=true
1633 niro 226 fi
1634     ((x++))
1635     done
1636 niro 273
1637     # abort if not installed
1638     if [[ ${pkg_installed} != true ]]
1639 niro 226 then
1640 niro 273 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1641     echo "${pkgname} does not exists in ${virtualname}."
1642 niro 226 return 0
1643     fi
1644 niro 273
1645 niro 226 if [ ${x} -ge 2 ]
1646     then
1647 niro 273 method=update
1648 niro 226 else
1649 niro 273 method=delall
1650 niro 226 fi
1651 niro 273
1652     # get the complete line
1653     oldline="$(virtuals_read ${virtualname} showline)"
1654    
1655     # make a backup of the db
1656 niro 226 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1657 niro 273
1658     # parse virtualdb
1659     OLDIFS="${IFS}"
1660 niro 226 IFS=$'\n'
1661     for line in $(< ${VIRTUALDB_FILE}.old)
1662     do
1663 niro 273 if [[ ${line} = ${oldline} ]]
1664 niro 226 then
1665     #delall or update?
1666 niro 273 case ${method} in
1667 niro 226 update)
1668 niro 273 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1669     echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..."
1670     # del PKG_NAME from line
1671     echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE}
1672 niro 226 ;;
1673     delall)
1674 niro 273 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
1675     echo "Deleting ${virtualname} in virtual database ..."
1676     # continue; do not write anything
1677 niro 226 continue
1678     ;;
1679     esac
1680     else
1681     echo "${line}" >> ${VIRTUALDB_FILE}
1682     fi
1683     done
1684 niro 273 # unset IFS
1685     IFS="${OLDIFS}"
1686 niro 226 else
1687 niro 273 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1688     echo "${virtualname} does not exists in virtual database."
1689 niro 226 fi
1690     }
1691    
1692     # gets real pkgname from virtuals.default
1693     #$1=VIRTUAL_NAME; returns PKG_NAME
1694     default_virtualname_to_pkgname()
1695     {
1696     local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1697    
1698     VIRTUAL_NAME=$1
1699    
1700     while read db_virtualname db_pkgname
1701     do
1702     if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1703     then
1704     PKG_NAME="${db_pkgname}"
1705     fi
1706     done << EOF
1707     $(< ${VIRTUALDB_DEFAULTS})
1708     EOF
1709    
1710     if [ -n "${PKG_NAME}" ]
1711     then
1712     echo "${PKG_NAME}"
1713     fi
1714     }
1715    
1716     minclude()
1717     {
1718     local i
1719    
1720     if [ -n "$@" ]
1721     then
1722     for i in $@
1723     do
1724     [[ ${MAGEDEBUG} = on ]] && \
1725     echo "--- Including ${MAGEDIR}/include/${i}.minc"
1726     source ${MAGEDIR}/include/${i}.minc
1727     done
1728     [[ ${MAGEDEBUG} = on ]] && echo
1729     fi
1730     }
1731    
1732     sminclude()
1733     {
1734     local i
1735    
1736     if [ -n "$@" ]
1737     then
1738     for i in $@
1739     do
1740     echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1741     source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1742     done
1743     echo
1744     fi
1745     }
1746    
1747     # checks if an newer mage version is available
1748     is_newer_mage_version_available()
1749     {
1750     local newest_mage
1751     local installed_mage
1752    
1753 niro 252 newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)"
1754 niro 226 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1755    
1756     if [[ ${newest_mage} > ${installed_mage} ]]
1757     then
1758     echo
1759     echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1760     echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1761     echo "It is recommened to install this newer version"
1762     echo "or your current system installation may brake."
1763     echo
1764     echo -en "Please update mage by running "
1765     echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1766     echo
1767     fi
1768     }
1769    
1770    
1771     # returns pname from pkgname
1772     # pkgname2pname $PKGNAME
1773     pkgname2pname()
1774     {
1775     local pname
1776    
1777     pname="${1%-*-*-*}"
1778     echo "${pname}"
1779     }
1780    
1781     # returns pver from pkgname
1782     # pkgname2pver $PKGNAME
1783     pkgname2pver()
1784     {
1785     local i pver
1786    
1787     i="${1/$(pkgname2pname $1)-/}"
1788     pver="${i%-*-*}"
1789     echo "${pver}"
1790     }
1791    
1792     # returns pbuild from pkgname
1793     # pkgname2pbuild $PKGNAME
1794     pkgname2pbuild()
1795     {
1796     local pbuild
1797    
1798     pbuild="${1##*-}"
1799     echo "${pbuild}"
1800     }
1801    
1802     # returns parch from pkgname
1803     # pkgname2parch $PKGNAME
1804     pkgname2parch()
1805     {
1806     local i x parch
1807    
1808     i="${1%-*-*}-"
1809     x="${1%-*}"
1810     parch="${x/${i}/}"
1811     echo "${parch}"
1812     }
1813    
1814     # returns pname from magename
1815     # magename2pname /PATH/TO/MAGE/FILE
1816     magename2pname()
1817     {
1818     local i pname
1819    
1820     i="$(basename $1 .mage)"
1821     pname="${i%-*-*}"
1822     echo "${pname}"
1823     }
1824    
1825     # returns pver from magename
1826     # magename2pver /PATH/TO/MAGE/FILE
1827     magename2pver()
1828     {
1829     local i pver
1830    
1831     i="$(basename $1 .mage)"
1832     i="${i/$(magename2pname $1)-/}"
1833     pver="${i%-*}"
1834     echo "${pver}"
1835     }
1836    
1837     # returns pbuild from magename
1838     # magename2pbuild /PATH/TO/MAGE/FILE
1839     magename2pbuild()
1840     {
1841     local i pbuild
1842    
1843     i="$(basename $1 .mage)"
1844     pbuild="${i##*-}"
1845     echo "${pbuild}"
1846     }
1847    
1848     # returns pcat from magename
1849     # magename2pcat /PATH/TO/MAGE/FILE
1850     magename2pcat()
1851     {
1852     local i pcat
1853    
1854     if [[ ${2} = installdb ]]
1855     then
1856     # go 1 dir back
1857     i="${1%/*}"
1858     else
1859     # go 2 dirs back
1860     i="${1%/*/*}"
1861     fi
1862    
1863     # get basename
1864     pcat="${i##*/}"
1865     echo "${pcat}"
1866     }
1867    
1868     # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION)
1869     # dep2pcat DEPEND
1870     dep2pcat()
1871     {
1872     local pcat
1873    
1874     pcat="${1%/*}"
1875     echo "${pcat}"
1876     }
1877    
1878     # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION)
1879     # $2=virtual is used to resolv VDEPEND from virtual packages
1880     # dep2pcat DEPEND (virtual)
1881     dep2pname()
1882     {
1883     local pname
1884    
1885     pname="${1##*/}"
1886    
1887     # cut version only if not virtual or it will cut the name
1888     if [[ $(dep2pcat $1) != virtual ]] && \
1889     [[ $2 != virtual ]]
1890     then
1891     pname="${pname%-*}"
1892     fi
1893    
1894     echo "${pname}"
1895     }
1896    
1897     dep2highest_magefile()
1898     {
1899     local pcat
1900     local pname
1901     local magefile
1902     local installed_virtuals
1903    
1904     pcat="$(dep2pcat $1)"
1905     pname="$(dep2pname $1)"
1906    
1907     if [[ ${pcat} = virtual ]]
1908     then
1909     # first check if virtual is already installed
1910     installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)"
1911     if [ -n "${installed_virtuals}" ]
1912     then
1913     for vpkg in ${installed_virtuals}
1914     do
1915     realpkgname="${vpkg}"
1916     virtualpkgname="${pcat}/${pname}"
1917     pcat="$(dep2pcat ${realpkgname})"
1918     pname="$(dep2pname ${realpkgname} virtual)"
1919     done
1920     else
1921     # choose one from virtualdb defaults (virtuals.defaults)
1922     realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})"
1923     virtualpkgname="${pcat}/${pname}"
1924     pcat="$(dep2pcat ${realpkgname})"
1925     pname="$(dep2pname ${realpkgname} virtual)"
1926     fi
1927     fi
1928    
1929     magefile="$(get_highest_magefile ${pcat} ${pname})"
1930     echo "${magefile}"
1931     }
1932    
1933     # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD}
1934     is_installed()
1935     {
1936     local fullpkgname="$1"
1937    
1938     # return 0 if installed
1939     [ -d ${MROOT}${INSTALLDB}/${fullpkgname} ] && return 0
1940    
1941     return 1
1942     }
1943    
1944     install_packages()
1945     {
1946     local list="$@"
1947     local pkg
1948     local pcat
1949     local pname
1950     local pver
1951     local pbuild
1952     local total_pkgs
1953     local current_pkg
1954     local src_install
1955     local uninstall_list
1956    
1957     # check for --src-install
1958     if [[ $1 = --src-install ]]
1959     then
1960     # remove --src-install from list
1961     list=${list/--src-install/}
1962     # enable src-install
1963     src_install="--src-install"
1964     fi
1965    
1966     # reset MAGE_PROTECT_COUNTER
1967     declare -i MAGE_PROTECT_COUNTER=0
1968     export MAGE_PROTECT_COUNTER
1969    
1970     # get count of total packages
1971     declare -i total_pkgs=0
1972     declare -i current_pkg=0
1973     for i in ${list}; do (( total_pkgs++ )); done
1974    
1975     echo
1976    
1977     if [[ -n ${MROOT} ]]
1978     then
1979     echo -ne ${COLRED}
1980     echo "!! installing in MROOT=${MROOT}"
1981     echo -ne ${COLDEFAULT}
1982     echo
1983     fi
1984    
1985     for pkg in ${list}
1986     do
1987     (( current_pkg++ ))
1988     pcat=$(magename2pcat ${pkg})
1989     pname=$(magename2pname ${pkg})
1990     pver=$(magename2pver ${pkg})
1991     pbuild=$(magename2pbuild ${pkg})
1992    
1993     mage_install \
1994     --pcat ${pcat} \
1995     --pname ${pname} \
1996     --pver ${pver} \
1997     --pbuild ${pbuild} \
1998     --count-total ${total_pkgs} \
1999     --count-current ${current_pkg} \
2000     ${src_install}
2001    
2002     # check for allready installed packages and remove them
2003     # except the package we have installed
2004     uninstall_list="$(get_uninstall_candidates \
2005     --pcat "${pcat}" \
2006     --pname "${pname}" \
2007     --protected ${pcat}/${pname}-${pver}-${pbuild})"
2008    
2009     # uninstall all packges in uninstall_list if not empty
2010     if [ -n "${uninstall_list}" ]
2011     then
2012     echo
2013     uninstall_packages ${uninstall_list} \
2014     || die "install_packges() uninstalling not-needed."
2015     fi
2016    
2017     # crlf for better view in VERBOSE mode
2018     #if [[ ${VERBOSE} = on ]]; then echo; fi
2019     echo
2020     done
2021    
2022     #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}"
2023     show_etc_update_mesg
2024     }
2025    
2026     # get_value_from_magefile VARIABLE
2027     # returns the content of this VAR
2028     get_value_from_magefile()
2029     {
2030     local var="$1"
2031     local magefile="$2"
2032     local value
2033    
2034     # local all possible vars of a mage file
2035     # to prevent bad issues
2036     local PKGNAME
2037     local STATE
2038     local DESCRIPTION
2039     local HOMEPAGE
2040     local DEPEND
2041     local SDEPEND
2042     local PROVIDE
2043     local PKGTYPE
2044     local preinstall
2045     local postinstall
2046 niro 248 local preremove
2047     local postremove
2048 niro 226
2049     # sanity checks
2050     [ -f ${magefile} ] && source ${magefile} || \
2051     die "get_value_from_magefile: ${magefile} not found."
2052     [ -z "${var}" ] && die "get_value_from_magefile: \$var not given."
2053    
2054     source ${magefile}
2055     eval value=\$$(echo ${var})
2056     echo "${value}"
2057 niro 248
2058 niro 258 # unset these functions
2059     unset -f preinstall
2060     unset -f postinstall
2061     unset -f preremove
2062     unset -f postremove
2063 niro 226 }
2064    
2065     mage_install()
2066     {
2067     # local all possible vars of a mage file
2068     # to prevent bad issues
2069     local PKGNAME
2070     local STATE
2071     local DESCRIPTION
2072     local HOMEPAGE
2073     local DEPEND
2074     local SDEPEND
2075     local PROVIDE
2076     local PKGTYPE
2077     local preinstall
2078     local postinstall
2079 niro 248 local preremove
2080     local postremove
2081 niro 226
2082     local pcat
2083     local pname
2084     local pver
2085     local pbuild
2086     local count_total
2087     local count_current
2088     local magefile
2089     local src_install
2090    
2091     # very basic getops
2092     for i in $*
2093     do
2094     case $1 in
2095     --pcat|-c) shift; pcat="$1" ;;
2096     --pname|-n) shift; pname="$1" ;;
2097     --pver|-v) shift; pver="$1" ;;
2098     --pbuild|-b) shift; pbuild="$1" ;;
2099     --count-total) shift; count_total="$1" ;;
2100     --count-current) shift; count_current="$1" ;;
2101     --src-install|-s) shift; src_install=true ;;
2102     esac
2103     shift
2104     done
2105    
2106     # sanity checks; abort if not given
2107     [ -z "${pcat}" ] && die "mage_install() \$pcat not given."
2108     [ -z "${pname}" ] && die "mage_install() \$pname not given."
2109     [ -z "${pver}" ] && die "mage_install() \$pver not given."
2110     [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given."
2111    
2112     # check needed global vars
2113     [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set."
2114     [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set."
2115     [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set."
2116    
2117     xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]"
2118     echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2119     echo -n "installing (${count_current}/${count_total}): "
2120     echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2121     echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2122    
2123     magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
2124     source ${magefile}
2125    
2126     # abort on sources if no srcinstall
2127     if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]]
2128     then
2129     echo
2130     echo -e "This Package is a Source Package."
2131     echo
2132     echo -e "Only 'srcinstall' works with this type of packages"
2133     echo -en "If you have done a srcinstall before, "
2134     echo -e "you will find the files in /usr/src."
2135     echo
2136     exit 1
2137     fi
2138    
2139     ## preinstall scripts
2140     if [ -n "$(typeset -f preinstall)" ]
2141     then
2142     echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... "
2143     preinstall
2144     unset preinstall
2145     fi
2146    
2147     if [[ ${src_install} = true ]]
2148     then
2149     local smage2file
2150     # check needed global vars
2151     [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set."
2152     [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set."
2153     [ -z "${BINDIR}" ] && die "\$BINDIR not set."
2154    
2155     # build the package first
2156     if [[ ${MAGEDEBUG} = on ]]
2157     then
2158     echo M:${pname}
2159     echo V:${pver}
2160     echo B:${pbuild}
2161     fi
2162    
2163     smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2164     if [ -f "${smage2file}" ]
2165     then
2166     smage2 ${smage2file} || die "compile failed"
2167     else
2168     echo
2169     echo "$(basename ${SMAGEFILE}) not found."
2170     echo "update your smage-tree and try it again."
2171     echo
2172     die
2173     fi
2174     fi
2175    
2176     if [[ ${PKGTYPE} != virtual ]] && \
2177     [[ ${PKGTYPE} != sources ]]
2178     then
2179     # show a verbose message on src-install
2180     if [[ ${src_install} = true ]]
2181     then
2182     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2183     echo -ne "merging files: "
2184     echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2185     echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2186     fi
2187     build_doinstall ${PKGNAME}
2188     fi
2189    
2190     ## postinstall scripts
2191     if [ -n "$(typeset -f postinstall)" ]
2192     then
2193     echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... "
2194     postinstall
2195     unset postinstall
2196     fi
2197    
2198     # install a database entry
2199     install_database_entry \
2200     --pcat "${pcat}" \
2201     --pname "${pname}" \
2202     --pver "${pver}" \
2203     --pbuild "${pbuild}" \
2204     --pkgname "${PKGNAME}" \
2205     --pkgtype "${PKGTYPE}" \
2206     || die "error in mage_install() running install_database_entry()."
2207    
2208     # remove the package dir now
2209     if [ -d ${BUILDDIR}/${PKGNAME} ]
2210     then
2211     rm -rf ${BUILDDIR}/${PKGNAME}
2212     fi
2213    
2214     # rebuilds toplevel info node
2215     if [[ ${MAGE_INFO_REBUILD} = true ]]
2216     then
2217     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2218     echo -n "rebuilding top-level info node ... "
2219     ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2220     > ${MROOT}/usr/share/info/dir && \
2221     echo "done." || echo "failure."
2222     unset MAGE_INFO_REBUILD
2223     fi
2224    
2225     # rebuilds the enviroment with the content of /etc/env.d
2226     if [[ ${MAGE_ENV_REBUILD} = true ]]
2227     then
2228     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2229     echo -n "rebuilding environment ... "
2230     ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2231     echo "done." || echo "failure."
2232     unset MAGE_ENV_REBUILD
2233     fi
2234    
2235     xtitleclean
2236    
2237     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2238     echo -n "package "
2239     # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2240     # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2241     echo "successfully installed."
2242 niro 248
2243 niro 258 # unset these functions
2244     unset -f preinstall
2245     unset -f postinstall
2246     unset -f preremove
2247     unset -f postremove
2248 niro 226 }
2249    
2250     md5sum_packages()
2251     {
2252     local list="$@"
2253     local magefile
2254     local pcat
2255     local pname
2256     local pkgname
2257     local pkgfile
2258     local pkgtype
2259     local count_current
2260     local count_total
2261    
2262     # get count of total packages
2263     declare -i count_current=0
2264     declare -i count_total=0
2265    
2266     for i in ${list}; do (( count_total++ )); done
2267    
2268     for magefile in ${list}
2269     do
2270     pcat=$(magename2pcat ${magefile})
2271     pname=$(magename2pname ${magefile})
2272     pkgname="$(get_value_from_magefile PKGNAME ${magefile})"
2273     md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pkgname}.md5"
2274     pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
2275     pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
2276    
2277     (( count_current++ ))
2278     xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]"
2279    
2280     # abort on virtual pkg
2281     if [[ ${pkgtype} = virtual ]]
2282     then
2283     echo -ne " ${COLBLUE}---${COLDEFAULT}"
2284     echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2285     continue
2286     fi
2287    
2288     # abort on sources pkg
2289     if [[ ${pkgtype} = sources ]]
2290     then
2291     echo -ne " ${COLBLUE}---${COLDEFAULT}"
2292     echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2293     continue
2294     fi
2295    
2296     if [ -f "${md5file}" ]
2297     then
2298     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2299     echo -ne "checking md5sum (${count_current}/${count_total}): "
2300     ( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed"
2301     else
2302     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2303     echo -e "!! no md5sum file found for ${pkgfile} :("
2304     fi
2305     done
2306    
2307     # add a crlf for a better view
2308     if [ ${count_total} -gt 1 ]; then echo; fi
2309     }
2310    
2311     ## uninstall_packages ulist
2312     uninstall_packages()
2313     {
2314     local list="$@"
2315     local pcat
2316     local pname
2317     local pver
2318     local pbuild
2319     local can_pcat
2320     local can_pname
2321     local can_ver_list
2322    
2323     if [[ -n ${MROOT} ]]
2324     then
2325     echo -ne ${COLRED}
2326     echo "!! uninstalling from MROOT=${MROOT}"
2327     echo -ne ${COLDEFAULT}
2328     echo
2329     fi
2330    
2331     # generate a candidates list
2332     for pkg in ${list}
2333     do
2334     pcat=$(dep2pcat ${pkg})
2335     pname=$(magename2pname ${pkg})
2336     pver=$(magename2pver ${pkg})
2337     pbuild=$(magename2pbuild ${pkg})
2338     can_pcat="${pcat}"
2339     can_pname="${pname}"
2340    
2341     if [ -z "${can_ver_list}" ]
2342     then
2343     can_ver_list=" ${pver}-${pbuild}"
2344     else
2345     can_ver_list="${can_ver_list}, ${pver}-${pbuild}"
2346     fi
2347     done
2348    
2349     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2350     echo "following candidate(s) will be removed:"
2351     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2352 niro 240 echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}"
2353 niro 226 echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"
2354     echo
2355 niro 240 if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ]
2356     then
2357     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2358     echo "( Press [CTRL+C] to abort )"
2359     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2360     echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."
2361     for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))
2362     do
2363     echo -ne "${COLRED} ${i}${COLDEFAULT}"
2364     sleep 1
2365     done
2366     echo
2367     echo
2368     fi
2369 niro 226
2370     for pkg in ${list}
2371     do
2372     pcat=$(dep2pcat ${pkg})
2373     pname=$(magename2pname ${pkg})
2374     pver=$(magename2pver ${pkg})
2375     pbuild=$(magename2pbuild ${pkg})
2376    
2377     mage_uninstall \
2378     --pcat ${pcat} \
2379     --pname ${pname} \
2380     --pver ${pver} \
2381     --pbuild ${pbuild} \
2382     --count-total ${total_pkgs} \
2383     --count-current ${current_pkg} \
2384     ${src_install}
2385    
2386     # crlf for better view in VERBOSE mode
2387     #if [[ ${VERBOSE} = on ]]; then echo; fi
2388     echo
2389     done
2390     }
2391    
2392     mage_uninstall()
2393     {
2394     # local all possible vars of a mage file
2395     # to prevent bad issues
2396     local PKGNAME
2397     local STATE
2398     local DESCRIPTION
2399     local HOMEPAGE
2400     local DEPEND
2401     local SDEPEND
2402     local PROVIDE
2403     local PKGTYPE
2404     local preinstall
2405     local postinstall
2406 niro 248 local preremove
2407     local postremove
2408 niro 226
2409     local pcat
2410     local pname
2411     local pver
2412     local pbuild
2413     local magefile
2414     local i
2415    
2416     # very basic getops
2417     for i in $*
2418     do
2419     case $1 in
2420     --pcat|-c) shift; pcat="$1" ;;
2421     --pname|-n) shift; pname="$1" ;;
2422     --pver|-v) shift; pver="$1" ;;
2423     --pbuild|-b) shift; pbuild="$1" ;;
2424     esac
2425     shift
2426     done
2427    
2428     # sanity checks; abort if not given
2429     [ -z "${pcat}" ] && die "mage_uninstall() \$pcat not given."
2430     [ -z "${pname}" ] && die "mage_uninstall() \$pname not given."
2431     [ -z "${pver}" ] && die "mage_uninstall() \$pver not given."
2432     [ -z "${pbuild}" ] && die "mage_uninstall() \$pbuild not given."
2433    
2434     # check needed global vars
2435     [ -z "${MAGEDIR}" ] && die "mage_uninstall() \$MAGEDIR not set."
2436     [ -z "${INSTALLDB}" ] && die "mage_uninstall() \$INSTALLDB not set."
2437     [ -z "${BUILDDIR}" ] && die "mage_uninstall() \$BUILDDIR not set."
2438    
2439     xtitle "[ (${count_current}/${count_total}) Removing ${pcat}/${pname}-${pver}-${pbuild} ]"
2440     echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2441     echo -n "removing: "
2442     echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2443     echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2444    
2445 niro 240 magefile="${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2446 niro 226 source ${magefile}
2447    
2448     ## preremove scripts
2449     if [ -n "$(typeset -f preremove)" ]
2450     then
2451     echo -e " ${COLBLUE}***${COLDEFAULT} running preremove ... "
2452     preremove
2453     unset preremove
2454     fi
2455    
2456     # runs uninstall
2457     build_douninstall \
2458     --pcat "${pcat}" \
2459     --pname "${pname}" \
2460     --pver "${pver}" \
2461     --pbuild "${pbuild}"
2462    
2463     ## postremove scripts
2464     if [ -n "$(typeset -f postremove)" ]
2465     then
2466     echo -e " ${COLBLUE}***${COLDEFAULT} running postremove ... "
2467     postremove
2468     unset postremove
2469     fi
2470    
2471     # removes the database entry
2472     remove_database_entry \
2473     --pcat "${pcat}" \
2474     --pname "${pname}" \
2475     --pver "${pver}" \
2476     --pbuild "${pbuild}" \
2477     || die "error in mage_uninstall() running remove_database_entry()."
2478    
2479     # rebuilds toplevel info node
2480     if [[ ${MAGE_INFO_REBUILD} = true ]]
2481     then
2482     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2483     echo -n "rebuilding top-level info node ... "
2484     ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2485     > ${MROOT}/usr/share/info/dir && \
2486     echo "done." || echo "failure."
2487     unset MAGE_INFO_REBUILD
2488     fi
2489    
2490     # rebuilds the enviroment with the content of /etc/env.d
2491     if [[ ${MAGE_ENV_REBUILD} = true ]]
2492     then
2493     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2494     echo -n "rebuilding environment ... "
2495     ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2496     echo "done." || echo "failure."
2497     unset MAGE_ENV_REBUILD
2498     fi
2499    
2500     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2501     echo -n "package "
2502     # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2503     # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2504     echo "successfully removed."
2505 niro 248
2506 niro 258 # unset these functions
2507     unset -f preinstall
2508     unset -f postinstall
2509     unset -f preremove
2510     unset -f postremove
2511 niro 226 }
2512    
2513     show_etc_update_mesg() {
2514     [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
2515    
2516     echo
2517     echo -ne "${COLRED}"
2518     echo "Important:"
2519     echo -ne ${COLDEFAULT}
2520     echo "${MAGE_PROTECT_COUNTER} protected file(s) were installed."
2521     echo
2522     echo "Please run 'etc-update' to update your configuration files."
2523     echo
2524     }
2525 niro 237
2526     pkgsearch()
2527     {
2528     local string="$1"
2529     local result
2530     local pkg
2531     local pcat
2532     local pname
2533     local magefile
2534     local pver
2535     local pbuild
2536     local state
2537     local descriptiom
2538     local homepage
2539     local i
2540     local all_installed
2541     local ipver
2542     local ipbuild
2543    
2544     # only names no versions
2545 niro 328 result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name '*'${string}'*')"
2546     #result="$(find ${MAGEDIR} -type f -name '*'${string}'*'.mage | sort)"
2547 niro 237
2548     # nothing found
2549     [[ -z ${result} ]] && die "No package found containing '${string}' in the name."
2550    
2551     for pkg in ${result}
2552     do
2553     # dirty, but does the job
2554     pcat="$(magename2pcat ${pkg}/foo)"
2555     pname="$(magename2pname ${pkg}-foo-foo)"
2556    
2557     # get highest version available
2558     magefile=$(get_highest_magefile ${pcat} ${pname})
2559    
2560     # now get all needed infos to print a nice output
2561     pver="$(magename2pver ${magefile})"
2562     pbuild="$(magename2pbuild ${magefile})"
2563     state="$(get_value_from_magefile STATE ${magefile})"
2564     description="$(get_value_from_magefile DESCRIPTION ${magefile})"
2565     homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
2566    
2567     # all installed
2568     for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
2569     do
2570     ipver="$(magename2pver ${i})"
2571     ipbuild="$(magename2pbuild ${i})"
2572    
2573     if [[ -z ${all_installed} ]]
2574     then
2575     all_installed="${ipver}-${ipbuild}"
2576     else
2577     all_installed="${all_installed} ${ipver}-${ipbuild}"
2578     fi
2579     done
2580     [[ -z ${all_installed} ]] && all_installed="none"
2581    
2582     case ${state} in
2583     stable) state=${COLGREEN}"[s] ";;
2584     testing) state=${COLYELLOW}"[t] ";;
2585     unstable) state=${COLRED}"[u] ";;
2586     old) state=${COLGRAY}"[o] ";;
2587     esac
2588    
2589     echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
2590     echo " Latest available: ${pver}-${pbuild}"
2591     echo " Installed versions: ${all_installed}"
2592     echo " Description: ${description}"
2593     echo " Homepage: ${homepage}"
2594     echo
2595    
2596     unset pcat
2597     unset pname
2598     unset magefile
2599     unset pver
2600     unset pbuild
2601     unset state
2602     unset descriptiom
2603     unset homepage
2604     unset all_installed
2605     unset ipver
2606     unset ipbuild
2607     done
2608     }
2609 niro 249
2610     export_inherits()
2611     {
2612     local include="$1"
2613     shift
2614    
2615     while [ "$1" ]
2616     do
2617     local functions="$1"
2618    
2619     # sanity checks
2620     [ -z "${include}" ] && die "export_inherits(): \$include not given."
2621     [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
2622    
2623     eval "${functions}() { ${include}_${functions} ; }"
2624    
2625     # debug
2626     [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"
2627    
2628     shift
2629     done
2630     }