Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 312 - (hide annotations) (download) (as text)
Sun Jan 1 23:15:54 2006 UTC (18 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 60964 byte(s)
fixed installation of char-devices

1 niro 226 #!/bin/bash
2     # Magellan Linux Installer Functions (mage.functions.sh)
3 niro 312 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.13 2006-01-01 23:15:48 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 312 mknod -m ${posix} -c "${MROOT}${pathto}" ${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     # sanity checks; abort if not given
1472     [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."
1473    
1474    
1475     # check needed global vars
1476     [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."
1477    
1478     # set pcatdir to '*' if empty
1479     [ -z "${pcatdir}" ] && pcatdir=*
1480    
1481     for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*
1482     do
1483     # abort if not a dir
1484     [ ! -d ${pkg} ] && continue
1485    
1486     pname="$(magename2pname ${pkg})"
1487    
1488     if [[ ${search_pname} = ${pname} ]]
1489     then
1490     pcat="$(magename2pcat ${pkg} installdb)"
1491     pver="$(magename2pver ${pkg})"
1492     pbuild="$(magename2pbuild ${pkg})"
1493    
1494     # exclude proteced
1495     [[ ${protected} = ${pcat}/${pname}-${pver}-${pbuild} ]] && continue
1496    
1497     list="${list} ${pcat}/${pname}-${pver}-${pbuild}"
1498     fi
1499     done
1500    
1501     echo "${list}"
1502     }
1503    
1504     # reads virtualdb file
1505     #$1 = virtualname; $2 commands: showpkgs, showline
1506     #return 0 == installed -> shows installed pkg as well
1507     #return 1 == not installed
1508     virtuals_read()
1509     {
1510     local virtualname="$1"
1511     local command="$2"
1512     local virtline
1513     local line x i
1514    
1515     # parse file to get virtual_name line
1516     IFS=$'\n'
1517     for line in $(< ${MROOT}${VIRTUALDB_FILE})
1518     do
1519     IFS=$' '
1520     for x in ${line}
1521     do
1522     if [[ ${x} = ${virtualname} ]]
1523     then
1524     virtline="${line}"
1525     [[ ${command} = showline ]] && echo "${line}"
1526     fi
1527     done
1528     IFS=$'\n'
1529     done
1530    
1531     unset IFS
1532    
1533     # now read the packages linked to VIRTUAL_NAME and output them
1534     if [ -n "${virtline}" ]
1535     then
1536     if [[ ${command} = showpkgs ]]
1537     then
1538     declare -i x=0
1539     for i in ${virtline}
1540     do
1541     if [ ${x} -ge 1 ]
1542     then
1543     echo "${i}"
1544     fi
1545     ((x++))
1546     done
1547     fi
1548     return 0
1549     fi
1550     return 1
1551     }
1552    
1553    
1554     #add pkg to virtualdb
1555     # $1 == virtualname $2= pkgname
1556     # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1557     virtuals_add()
1558     {
1559     local virtualname="$1"
1560     local pkgname="$2"
1561     local oldline
1562     local line i
1563     local installed_file
1564 niro 273 local OLDIFS
1565 niro 226
1566     if virtuals_read ${virtualname}
1567     then
1568     # make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1569     for i in $(virtuals_read ${virtualname} showpkgs)
1570     do
1571     if [[ ${i} = ${pkgname} ]]
1572     then
1573     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1574     echo "${pkgname} already linked as ${virtualname} ..."
1575     #return 3
1576     return 0
1577     fi
1578     done
1579    
1580     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1581     echo "updating ${virtualname} entry with ${pkgname} ..."
1582     oldline="$(virtuals_read ${virtualname} showline)"
1583    
1584     # make a backup
1585     mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old
1586    
1587 niro 273 OLDIFS="${IFS}"
1588 niro 226 IFS=$'\n'
1589     for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)
1590     do
1591     # if the right line, append ${pkgname}, else do nothing
1592     if [[ ${line} = ${oldline} ]]
1593     then
1594     echo "${line} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1595     else
1596     echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}
1597     fi
1598     done
1599 niro 273 # unset IFS
1600     IFS="${OLDIFS}"
1601 niro 226 else
1602 niro 273 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
1603 niro 226 echo "register ${pkgname} as ${virtualname} ..."
1604     echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1605     fi
1606    
1607     return 0
1608     }
1609    
1610     #deletes pakages from virtual database
1611     #$1 virtualname; $2 pkgname
1612     virtuals_del() {
1613    
1614 niro 273 local virtualname="$1"
1615     local pkgname="$2"
1616     local oldline
1617     local method
1618     local line i x
1619     local pkg_installed
1620     local OLDIFS
1621    
1622     # first check if exists
1623     if virtuals_read ${virtualname}
1624 niro 226 then
1625 niro 273 # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1626 niro 226 declare -i x=0
1627 niro 273 for i in $(virtuals_read ${virtualname} showpkgs)
1628 niro 226 do
1629 niro 273 if [[ ${i} = ${pkgname} ]]
1630 niro 226 then
1631 niro 273 pkg_installed=true
1632 niro 226 fi
1633     ((x++))
1634     done
1635 niro 273
1636     # abort if not installed
1637     if [[ ${pkg_installed} != true ]]
1638 niro 226 then
1639 niro 273 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1640     echo "${pkgname} does not exists in ${virtualname}."
1641 niro 226 return 0
1642     fi
1643 niro 273
1644 niro 226 if [ ${x} -ge 2 ]
1645     then
1646 niro 273 method=update
1647 niro 226 else
1648 niro 273 method=delall
1649 niro 226 fi
1650 niro 273
1651     # get the complete line
1652     oldline="$(virtuals_read ${virtualname} showline)"
1653    
1654     # make a backup of the db
1655 niro 226 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1656 niro 273
1657     # parse virtualdb
1658     OLDIFS="${IFS}"
1659 niro 226 IFS=$'\n'
1660     for line in $(< ${VIRTUALDB_FILE}.old)
1661     do
1662 niro 273 if [[ ${line} = ${oldline} ]]
1663 niro 226 then
1664     #delall or update?
1665 niro 273 case ${method} in
1666 niro 226 update)
1667 niro 273 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1668     echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..."
1669     # del PKG_NAME from line
1670     echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE}
1671 niro 226 ;;
1672     delall)
1673 niro 273 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
1674     echo "Deleting ${virtualname} in virtual database ..."
1675     # continue; do not write anything
1676 niro 226 continue
1677     ;;
1678     esac
1679     else
1680     echo "${line}" >> ${VIRTUALDB_FILE}
1681     fi
1682     done
1683 niro 273 # unset IFS
1684     IFS="${OLDIFS}"
1685 niro 226 else
1686 niro 273 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1687     echo "${virtualname} does not exists in virtual database."
1688 niro 226 fi
1689     }
1690    
1691     # gets real pkgname from virtuals.default
1692     #$1=VIRTUAL_NAME; returns PKG_NAME
1693     default_virtualname_to_pkgname()
1694     {
1695     local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1696    
1697     VIRTUAL_NAME=$1
1698    
1699     while read db_virtualname db_pkgname
1700     do
1701     if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1702     then
1703     PKG_NAME="${db_pkgname}"
1704     fi
1705     done << EOF
1706     $(< ${VIRTUALDB_DEFAULTS})
1707     EOF
1708    
1709     if [ -n "${PKG_NAME}" ]
1710     then
1711     echo "${PKG_NAME}"
1712     fi
1713     }
1714    
1715     minclude()
1716     {
1717     local i
1718    
1719     if [ -n "$@" ]
1720     then
1721     for i in $@
1722     do
1723     [[ ${MAGEDEBUG} = on ]] && \
1724     echo "--- Including ${MAGEDIR}/include/${i}.minc"
1725     source ${MAGEDIR}/include/${i}.minc
1726     done
1727     [[ ${MAGEDEBUG} = on ]] && echo
1728     fi
1729     }
1730    
1731     sminclude()
1732     {
1733     local i
1734    
1735     if [ -n "$@" ]
1736     then
1737     for i in $@
1738     do
1739     echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1740     source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1741     done
1742     echo
1743     fi
1744     }
1745    
1746     # checks if an newer mage version is available
1747     is_newer_mage_version_available()
1748     {
1749     local newest_mage
1750     local installed_mage
1751    
1752 niro 252 newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)"
1753 niro 226 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1754    
1755     if [[ ${newest_mage} > ${installed_mage} ]]
1756     then
1757     echo
1758     echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1759     echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1760     echo "It is recommened to install this newer version"
1761     echo "or your current system installation may brake."
1762     echo
1763     echo -en "Please update mage by running "
1764     echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1765     echo
1766     fi
1767     }
1768    
1769    
1770     # returns pname from pkgname
1771     # pkgname2pname $PKGNAME
1772     pkgname2pname()
1773     {
1774     local pname
1775    
1776     pname="${1%-*-*-*}"
1777     echo "${pname}"
1778     }
1779    
1780     # returns pver from pkgname
1781     # pkgname2pver $PKGNAME
1782     pkgname2pver()
1783     {
1784     local i pver
1785    
1786     i="${1/$(pkgname2pname $1)-/}"
1787     pver="${i%-*-*}"
1788     echo "${pver}"
1789     }
1790    
1791     # returns pbuild from pkgname
1792     # pkgname2pbuild $PKGNAME
1793     pkgname2pbuild()
1794     {
1795     local pbuild
1796    
1797     pbuild="${1##*-}"
1798     echo "${pbuild}"
1799     }
1800    
1801     # returns parch from pkgname
1802     # pkgname2parch $PKGNAME
1803     pkgname2parch()
1804     {
1805     local i x parch
1806    
1807     i="${1%-*-*}-"
1808     x="${1%-*}"
1809     parch="${x/${i}/}"
1810     echo "${parch}"
1811     }
1812    
1813     # returns pname from magename
1814     # magename2pname /PATH/TO/MAGE/FILE
1815     magename2pname()
1816     {
1817     local i pname
1818    
1819     i="$(basename $1 .mage)"
1820     pname="${i%-*-*}"
1821     echo "${pname}"
1822     }
1823    
1824     # returns pver from magename
1825     # magename2pver /PATH/TO/MAGE/FILE
1826     magename2pver()
1827     {
1828     local i pver
1829    
1830     i="$(basename $1 .mage)"
1831     i="${i/$(magename2pname $1)-/}"
1832     pver="${i%-*}"
1833     echo "${pver}"
1834     }
1835    
1836     # returns pbuild from magename
1837     # magename2pbuild /PATH/TO/MAGE/FILE
1838     magename2pbuild()
1839     {
1840     local i pbuild
1841    
1842     i="$(basename $1 .mage)"
1843     pbuild="${i##*-}"
1844     echo "${pbuild}"
1845     }
1846    
1847     # returns pcat from magename
1848     # magename2pcat /PATH/TO/MAGE/FILE
1849     magename2pcat()
1850     {
1851     local i pcat
1852    
1853     if [[ ${2} = installdb ]]
1854     then
1855     # go 1 dir back
1856     i="${1%/*}"
1857     else
1858     # go 2 dirs back
1859     i="${1%/*/*}"
1860     fi
1861    
1862     # get basename
1863     pcat="${i##*/}"
1864     echo "${pcat}"
1865     }
1866    
1867     # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION)
1868     # dep2pcat DEPEND
1869     dep2pcat()
1870     {
1871     local pcat
1872    
1873     pcat="${1%/*}"
1874     echo "${pcat}"
1875     }
1876    
1877     # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION)
1878     # $2=virtual is used to resolv VDEPEND from virtual packages
1879     # dep2pcat DEPEND (virtual)
1880     dep2pname()
1881     {
1882     local pname
1883    
1884     pname="${1##*/}"
1885    
1886     # cut version only if not virtual or it will cut the name
1887     if [[ $(dep2pcat $1) != virtual ]] && \
1888     [[ $2 != virtual ]]
1889     then
1890     pname="${pname%-*}"
1891     fi
1892    
1893     echo "${pname}"
1894     }
1895    
1896     dep2highest_magefile()
1897     {
1898     local pcat
1899     local pname
1900     local magefile
1901     local installed_virtuals
1902    
1903     pcat="$(dep2pcat $1)"
1904     pname="$(dep2pname $1)"
1905    
1906     if [[ ${pcat} = virtual ]]
1907     then
1908     # first check if virtual is already installed
1909     installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)"
1910     if [ -n "${installed_virtuals}" ]
1911     then
1912     for vpkg in ${installed_virtuals}
1913     do
1914     realpkgname="${vpkg}"
1915     virtualpkgname="${pcat}/${pname}"
1916     pcat="$(dep2pcat ${realpkgname})"
1917     pname="$(dep2pname ${realpkgname} virtual)"
1918     done
1919     else
1920     # choose one from virtualdb defaults (virtuals.defaults)
1921     realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})"
1922     virtualpkgname="${pcat}/${pname}"
1923     pcat="$(dep2pcat ${realpkgname})"
1924     pname="$(dep2pname ${realpkgname} virtual)"
1925     fi
1926     fi
1927    
1928     magefile="$(get_highest_magefile ${pcat} ${pname})"
1929     echo "${magefile}"
1930     }
1931    
1932     # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD}
1933     is_installed()
1934     {
1935     local fullpkgname="$1"
1936    
1937     # return 0 if installed
1938     [ -d ${MROOT}${INSTALLDB}/${fullpkgname} ] && return 0
1939    
1940     return 1
1941     }
1942    
1943     install_packages()
1944     {
1945     local list="$@"
1946     local pkg
1947     local pcat
1948     local pname
1949     local pver
1950     local pbuild
1951     local total_pkgs
1952     local current_pkg
1953     local src_install
1954     local uninstall_list
1955    
1956     # check for --src-install
1957     if [[ $1 = --src-install ]]
1958     then
1959     # remove --src-install from list
1960     list=${list/--src-install/}
1961     # enable src-install
1962     src_install="--src-install"
1963     fi
1964    
1965     # reset MAGE_PROTECT_COUNTER
1966     declare -i MAGE_PROTECT_COUNTER=0
1967     export MAGE_PROTECT_COUNTER
1968    
1969     # get count of total packages
1970     declare -i total_pkgs=0
1971     declare -i current_pkg=0
1972     for i in ${list}; do (( total_pkgs++ )); done
1973    
1974     echo
1975    
1976     if [[ -n ${MROOT} ]]
1977     then
1978     echo -ne ${COLRED}
1979     echo "!! installing in MROOT=${MROOT}"
1980     echo -ne ${COLDEFAULT}
1981     echo
1982     fi
1983    
1984     for pkg in ${list}
1985     do
1986     (( current_pkg++ ))
1987     pcat=$(magename2pcat ${pkg})
1988     pname=$(magename2pname ${pkg})
1989     pver=$(magename2pver ${pkg})
1990     pbuild=$(magename2pbuild ${pkg})
1991    
1992     mage_install \
1993     --pcat ${pcat} \
1994     --pname ${pname} \
1995     --pver ${pver} \
1996     --pbuild ${pbuild} \
1997     --count-total ${total_pkgs} \
1998     --count-current ${current_pkg} \
1999     ${src_install}
2000    
2001     # check for allready installed packages and remove them
2002     # except the package we have installed
2003     uninstall_list="$(get_uninstall_candidates \
2004     --pcat "${pcat}" \
2005     --pname "${pname}" \
2006     --protected ${pcat}/${pname}-${pver}-${pbuild})"
2007    
2008     # uninstall all packges in uninstall_list if not empty
2009     if [ -n "${uninstall_list}" ]
2010     then
2011     echo
2012     uninstall_packages ${uninstall_list} \
2013     || die "install_packges() uninstalling not-needed."
2014     fi
2015    
2016     # crlf for better view in VERBOSE mode
2017     #if [[ ${VERBOSE} = on ]]; then echo; fi
2018     echo
2019     done
2020    
2021     #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}"
2022     show_etc_update_mesg
2023     }
2024    
2025     # get_value_from_magefile VARIABLE
2026     # returns the content of this VAR
2027     get_value_from_magefile()
2028     {
2029     local var="$1"
2030     local magefile="$2"
2031     local value
2032    
2033     # local all possible vars of a mage file
2034     # to prevent bad issues
2035     local PKGNAME
2036     local STATE
2037     local DESCRIPTION
2038     local HOMEPAGE
2039     local DEPEND
2040     local SDEPEND
2041     local PROVIDE
2042     local PKGTYPE
2043     local preinstall
2044     local postinstall
2045 niro 248 local preremove
2046     local postremove
2047 niro 226
2048     # sanity checks
2049     [ -f ${magefile} ] && source ${magefile} || \
2050     die "get_value_from_magefile: ${magefile} not found."
2051     [ -z "${var}" ] && die "get_value_from_magefile: \$var not given."
2052    
2053     source ${magefile}
2054     eval value=\$$(echo ${var})
2055     echo "${value}"
2056 niro 248
2057 niro 258 # unset these functions
2058     unset -f preinstall
2059     unset -f postinstall
2060     unset -f preremove
2061     unset -f postremove
2062 niro 226 }
2063    
2064     mage_install()
2065     {
2066     # local all possible vars of a mage file
2067     # to prevent bad issues
2068     local PKGNAME
2069     local STATE
2070     local DESCRIPTION
2071     local HOMEPAGE
2072     local DEPEND
2073     local SDEPEND
2074     local PROVIDE
2075     local PKGTYPE
2076     local preinstall
2077     local postinstall
2078 niro 248 local preremove
2079     local postremove
2080 niro 226
2081     local pcat
2082     local pname
2083     local pver
2084     local pbuild
2085     local count_total
2086     local count_current
2087     local magefile
2088     local src_install
2089    
2090     # very basic getops
2091     for i in $*
2092     do
2093     case $1 in
2094     --pcat|-c) shift; pcat="$1" ;;
2095     --pname|-n) shift; pname="$1" ;;
2096     --pver|-v) shift; pver="$1" ;;
2097     --pbuild|-b) shift; pbuild="$1" ;;
2098     --count-total) shift; count_total="$1" ;;
2099     --count-current) shift; count_current="$1" ;;
2100     --src-install|-s) shift; src_install=true ;;
2101     esac
2102     shift
2103     done
2104    
2105     # sanity checks; abort if not given
2106     [ -z "${pcat}" ] && die "mage_install() \$pcat not given."
2107     [ -z "${pname}" ] && die "mage_install() \$pname not given."
2108     [ -z "${pver}" ] && die "mage_install() \$pver not given."
2109     [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given."
2110    
2111     # check needed global vars
2112     [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set."
2113     [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set."
2114     [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set."
2115    
2116     xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]"
2117     echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2118     echo -n "installing (${count_current}/${count_total}): "
2119     echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2120     echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2121    
2122     magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
2123     source ${magefile}
2124    
2125     # abort on sources if no srcinstall
2126     if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]]
2127     then
2128     echo
2129     echo -e "This Package is a Source Package."
2130     echo
2131     echo -e "Only 'srcinstall' works with this type of packages"
2132     echo -en "If you have done a srcinstall before, "
2133     echo -e "you will find the files in /usr/src."
2134     echo
2135     exit 1
2136     fi
2137    
2138     ## preinstall scripts
2139     if [ -n "$(typeset -f preinstall)" ]
2140     then
2141     echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... "
2142     preinstall
2143     unset preinstall
2144     fi
2145    
2146     if [[ ${src_install} = true ]]
2147     then
2148     local smage2file
2149     # check needed global vars
2150     [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set."
2151     [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set."
2152     [ -z "${BINDIR}" ] && die "\$BINDIR not set."
2153    
2154     # build the package first
2155     if [[ ${MAGEDEBUG} = on ]]
2156     then
2157     echo M:${pname}
2158     echo V:${pver}
2159     echo B:${pbuild}
2160     fi
2161    
2162     smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2163     if [ -f "${smage2file}" ]
2164     then
2165     smage2 ${smage2file} || die "compile failed"
2166     else
2167     echo
2168     echo "$(basename ${SMAGEFILE}) not found."
2169     echo "update your smage-tree and try it again."
2170     echo
2171     die
2172     fi
2173     fi
2174    
2175     if [[ ${PKGTYPE} != virtual ]] && \
2176     [[ ${PKGTYPE} != sources ]]
2177     then
2178     # show a verbose message on src-install
2179     if [[ ${src_install} = true ]]
2180     then
2181     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2182     echo -ne "merging files: "
2183     echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2184     echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2185     fi
2186     build_doinstall ${PKGNAME}
2187     fi
2188    
2189     ## postinstall scripts
2190     if [ -n "$(typeset -f postinstall)" ]
2191     then
2192     echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... "
2193     postinstall
2194     unset postinstall
2195     fi
2196    
2197     # install a database entry
2198     install_database_entry \
2199     --pcat "${pcat}" \
2200     --pname "${pname}" \
2201     --pver "${pver}" \
2202     --pbuild "${pbuild}" \
2203     --pkgname "${PKGNAME}" \
2204     --pkgtype "${PKGTYPE}" \
2205     || die "error in mage_install() running install_database_entry()."
2206    
2207     # remove the package dir now
2208     if [ -d ${BUILDDIR}/${PKGNAME} ]
2209     then
2210     rm -rf ${BUILDDIR}/${PKGNAME}
2211     fi
2212    
2213     # rebuilds toplevel info node
2214     if [[ ${MAGE_INFO_REBUILD} = true ]]
2215     then
2216     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2217     echo -n "rebuilding top-level info node ... "
2218     ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2219     > ${MROOT}/usr/share/info/dir && \
2220     echo "done." || echo "failure."
2221     unset MAGE_INFO_REBUILD
2222     fi
2223    
2224     # rebuilds the enviroment with the content of /etc/env.d
2225     if [[ ${MAGE_ENV_REBUILD} = true ]]
2226     then
2227     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2228     echo -n "rebuilding environment ... "
2229     ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2230     echo "done." || echo "failure."
2231     unset MAGE_ENV_REBUILD
2232     fi
2233    
2234     xtitleclean
2235    
2236     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2237     echo -n "package "
2238     # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2239     # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2240     echo "successfully installed."
2241 niro 248
2242 niro 258 # unset these functions
2243     unset -f preinstall
2244     unset -f postinstall
2245     unset -f preremove
2246     unset -f postremove
2247 niro 226 }
2248    
2249     md5sum_packages()
2250     {
2251     local list="$@"
2252     local magefile
2253     local pcat
2254     local pname
2255     local pkgname
2256     local pkgfile
2257     local pkgtype
2258     local count_current
2259     local count_total
2260    
2261     # get count of total packages
2262     declare -i count_current=0
2263     declare -i count_total=0
2264    
2265     for i in ${list}; do (( count_total++ )); done
2266    
2267     for magefile in ${list}
2268     do
2269     pcat=$(magename2pcat ${magefile})
2270     pname=$(magename2pname ${magefile})
2271     pkgname="$(get_value_from_magefile PKGNAME ${magefile})"
2272     md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pkgname}.md5"
2273     pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
2274     pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
2275    
2276     (( count_current++ ))
2277     xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]"
2278    
2279     # abort on virtual pkg
2280     if [[ ${pkgtype} = virtual ]]
2281     then
2282     echo -ne " ${COLBLUE}---${COLDEFAULT}"
2283     echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2284     continue
2285     fi
2286    
2287     # abort on sources pkg
2288     if [[ ${pkgtype} = sources ]]
2289     then
2290     echo -ne " ${COLBLUE}---${COLDEFAULT}"
2291     echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2292     continue
2293     fi
2294    
2295     if [ -f "${md5file}" ]
2296     then
2297     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2298     echo -ne "checking md5sum (${count_current}/${count_total}): "
2299     ( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed"
2300     else
2301     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2302     echo -e "!! no md5sum file found for ${pkgfile} :("
2303     fi
2304     done
2305    
2306     # add a crlf for a better view
2307     if [ ${count_total} -gt 1 ]; then echo; fi
2308     }
2309    
2310     ## uninstall_packages ulist
2311     uninstall_packages()
2312     {
2313     local list="$@"
2314     local pcat
2315     local pname
2316     local pver
2317     local pbuild
2318     local can_pcat
2319     local can_pname
2320     local can_ver_list
2321    
2322     if [[ -n ${MROOT} ]]
2323     then
2324     echo -ne ${COLRED}
2325     echo "!! uninstalling from MROOT=${MROOT}"
2326     echo -ne ${COLDEFAULT}
2327     echo
2328     fi
2329    
2330     # generate a candidates list
2331     for pkg in ${list}
2332     do
2333     pcat=$(dep2pcat ${pkg})
2334     pname=$(magename2pname ${pkg})
2335     pver=$(magename2pver ${pkg})
2336     pbuild=$(magename2pbuild ${pkg})
2337     can_pcat="${pcat}"
2338     can_pname="${pname}"
2339    
2340     if [ -z "${can_ver_list}" ]
2341     then
2342     can_ver_list=" ${pver}-${pbuild}"
2343     else
2344     can_ver_list="${can_ver_list}, ${pver}-${pbuild}"
2345     fi
2346     done
2347    
2348     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2349     echo "following candidate(s) will be removed:"
2350     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2351 niro 240 echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}"
2352 niro 226 echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"
2353     echo
2354 niro 240 if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ]
2355     then
2356     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2357     echo "( Press [CTRL+C] to abort )"
2358     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2359     echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."
2360     for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))
2361     do
2362     echo -ne "${COLRED} ${i}${COLDEFAULT}"
2363     sleep 1
2364     done
2365     echo
2366     echo
2367     fi
2368 niro 226
2369     for pkg in ${list}
2370     do
2371     pcat=$(dep2pcat ${pkg})
2372     pname=$(magename2pname ${pkg})
2373     pver=$(magename2pver ${pkg})
2374     pbuild=$(magename2pbuild ${pkg})
2375    
2376     mage_uninstall \
2377     --pcat ${pcat} \
2378     --pname ${pname} \
2379     --pver ${pver} \
2380     --pbuild ${pbuild} \
2381     --count-total ${total_pkgs} \
2382     --count-current ${current_pkg} \
2383     ${src_install}
2384    
2385     # crlf for better view in VERBOSE mode
2386     #if [[ ${VERBOSE} = on ]]; then echo; fi
2387     echo
2388     done
2389     }
2390    
2391     mage_uninstall()
2392     {
2393     # local all possible vars of a mage file
2394     # to prevent bad issues
2395     local PKGNAME
2396     local STATE
2397     local DESCRIPTION
2398     local HOMEPAGE
2399     local DEPEND
2400     local SDEPEND
2401     local PROVIDE
2402     local PKGTYPE
2403     local preinstall
2404     local postinstall
2405 niro 248 local preremove
2406     local postremove
2407 niro 226
2408     local pcat
2409     local pname
2410     local pver
2411     local pbuild
2412     local magefile
2413     local i
2414    
2415     # very basic getops
2416     for i in $*
2417     do
2418     case $1 in
2419     --pcat|-c) shift; pcat="$1" ;;
2420     --pname|-n) shift; pname="$1" ;;
2421     --pver|-v) shift; pver="$1" ;;
2422     --pbuild|-b) shift; pbuild="$1" ;;
2423     esac
2424     shift
2425     done
2426    
2427     # sanity checks; abort if not given
2428     [ -z "${pcat}" ] && die "mage_uninstall() \$pcat not given."
2429     [ -z "${pname}" ] && die "mage_uninstall() \$pname not given."
2430     [ -z "${pver}" ] && die "mage_uninstall() \$pver not given."
2431     [ -z "${pbuild}" ] && die "mage_uninstall() \$pbuild not given."
2432    
2433     # check needed global vars
2434     [ -z "${MAGEDIR}" ] && die "mage_uninstall() \$MAGEDIR not set."
2435     [ -z "${INSTALLDB}" ] && die "mage_uninstall() \$INSTALLDB not set."
2436     [ -z "${BUILDDIR}" ] && die "mage_uninstall() \$BUILDDIR not set."
2437    
2438     xtitle "[ (${count_current}/${count_total}) Removing ${pcat}/${pname}-${pver}-${pbuild} ]"
2439     echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2440     echo -n "removing: "
2441     echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2442     echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2443    
2444 niro 240 magefile="${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2445 niro 226 source ${magefile}
2446    
2447     ## preremove scripts
2448     if [ -n "$(typeset -f preremove)" ]
2449     then
2450     echo -e " ${COLBLUE}***${COLDEFAULT} running preremove ... "
2451     preremove
2452     unset preremove
2453     fi
2454    
2455     # runs uninstall
2456     build_douninstall \
2457     --pcat "${pcat}" \
2458     --pname "${pname}" \
2459     --pver "${pver}" \
2460     --pbuild "${pbuild}"
2461    
2462     ## postremove scripts
2463     if [ -n "$(typeset -f postremove)" ]
2464     then
2465     echo -e " ${COLBLUE}***${COLDEFAULT} running postremove ... "
2466     postremove
2467     unset postremove
2468     fi
2469    
2470     # removes the database entry
2471     remove_database_entry \
2472     --pcat "${pcat}" \
2473     --pname "${pname}" \
2474     --pver "${pver}" \
2475     --pbuild "${pbuild}" \
2476     || die "error in mage_uninstall() running remove_database_entry()."
2477    
2478     # rebuilds toplevel info node
2479     if [[ ${MAGE_INFO_REBUILD} = true ]]
2480     then
2481     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2482     echo -n "rebuilding top-level info node ... "
2483     ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2484     > ${MROOT}/usr/share/info/dir && \
2485     echo "done." || echo "failure."
2486     unset MAGE_INFO_REBUILD
2487     fi
2488    
2489     # rebuilds the enviroment with the content of /etc/env.d
2490     if [[ ${MAGE_ENV_REBUILD} = true ]]
2491     then
2492     echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2493     echo -n "rebuilding environment ... "
2494     ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2495     echo "done." || echo "failure."
2496     unset MAGE_ENV_REBUILD
2497     fi
2498    
2499     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2500     echo -n "package "
2501     # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2502     # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2503     echo "successfully removed."
2504 niro 248
2505 niro 258 # unset these functions
2506     unset -f preinstall
2507     unset -f postinstall
2508     unset -f preremove
2509     unset -f postremove
2510 niro 226 }
2511    
2512     show_etc_update_mesg() {
2513     [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
2514    
2515     echo
2516     echo -ne "${COLRED}"
2517     echo "Important:"
2518     echo -ne ${COLDEFAULT}
2519     echo "${MAGE_PROTECT_COUNTER} protected file(s) were installed."
2520     echo
2521     echo "Please run 'etc-update' to update your configuration files."
2522     echo
2523     }
2524 niro 237
2525     pkgsearch()
2526     {
2527     local string="$1"
2528     local result
2529     local pkg
2530     local pcat
2531     local pname
2532     local magefile
2533     local pver
2534     local pbuild
2535     local state
2536     local descriptiom
2537     local homepage
2538     local i
2539     local all_installed
2540     local ipver
2541     local ipbuild
2542    
2543     # only names no versions
2544     result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name *${string}*)"
2545     #result="$(find ${MAGEDIR} -type f -name *${string}*.mage | sort)"
2546    
2547     # nothing found
2548     [[ -z ${result} ]] && die "No package found containing '${string}' in the name."
2549    
2550     for pkg in ${result}
2551     do
2552     # dirty, but does the job
2553     pcat="$(magename2pcat ${pkg}/foo)"
2554     pname="$(magename2pname ${pkg}-foo-foo)"
2555    
2556     # get highest version available
2557     magefile=$(get_highest_magefile ${pcat} ${pname})
2558    
2559     # now get all needed infos to print a nice output
2560     pver="$(magename2pver ${magefile})"
2561     pbuild="$(magename2pbuild ${magefile})"
2562     state="$(get_value_from_magefile STATE ${magefile})"
2563     description="$(get_value_from_magefile DESCRIPTION ${magefile})"
2564     homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
2565    
2566     # all installed
2567     for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
2568     do
2569     ipver="$(magename2pver ${i})"
2570     ipbuild="$(magename2pbuild ${i})"
2571    
2572     if [[ -z ${all_installed} ]]
2573     then
2574     all_installed="${ipver}-${ipbuild}"
2575     else
2576     all_installed="${all_installed} ${ipver}-${ipbuild}"
2577     fi
2578     done
2579     [[ -z ${all_installed} ]] && all_installed="none"
2580    
2581     case ${state} in
2582     stable) state=${COLGREEN}"[s] ";;
2583     testing) state=${COLYELLOW}"[t] ";;
2584     unstable) state=${COLRED}"[u] ";;
2585     old) state=${COLGRAY}"[o] ";;
2586     esac
2587    
2588     echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
2589     echo " Latest available: ${pver}-${pbuild}"
2590     echo " Installed versions: ${all_installed}"
2591     echo " Description: ${description}"
2592     echo " Homepage: ${homepage}"
2593     echo
2594    
2595     unset pcat
2596     unset pname
2597     unset magefile
2598     unset pver
2599     unset pbuild
2600     unset state
2601     unset descriptiom
2602     unset homepage
2603     unset all_installed
2604     unset ipver
2605     unset ipbuild
2606     done
2607     }
2608 niro 249
2609     export_inherits()
2610     {
2611     local include="$1"
2612     shift
2613    
2614     while [ "$1" ]
2615     do
2616     local functions="$1"
2617    
2618     # sanity checks
2619     [ -z "${include}" ] && die "export_inherits(): \$include not given."
2620     [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
2621    
2622     eval "${functions}() { ${include}_${functions} ; }"
2623    
2624     # debug
2625     [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"
2626    
2627     shift
2628     done
2629     }