Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 776 - (hide annotations) (download) (as text)
Sun Oct 5 10:32:24 2008 UTC (15 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 65491 byte(s)
-fixed blacklist handling

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