Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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