Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 329 by niro, Thu Feb 16 22:11:06 2006 UTC revision 1690 by niro, Thu Feb 16 12:00:59 2012 UTC
# Line 1  Line 1 
1  #!/bin/bash  #!/bin/bash
2  # Magellan Linux Installer Functions (mage.functions.sh)  # Magellan Linux Installer Functions (mage.functions.sh)
3  # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.16 2006-02-16 22:11:06 niro Exp $  # $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    
5    COLRED="\033[1;6m\033[31m"
6    COLGREEN="\033[1;6m\033[32m"
7    COLYELLOW="\033[1;6m\033[33m"
8    COLBLUE="\033[1;6m\033[34m"
9    COLMAGENTA="\033[1;6m\033[35m"
10    COLWHITE="\033[1;6m\033[37m"
11    COLGRAY="\033[0;6m\033[37m"
12    COLBOLD="\033[1m"
13    COLDEFAULT="\033[0m"
14    
15    if [[ ${NOCOLORS} = true ]]
16    then
17     COLRED=""
18     COLGREEN=""
19     COLYELLOW=""
20     COLBLUE=""
21     COLMAGENTA=""
22     COLWHITE=""
23     COLGRAY=""
24     COLBOLD=""
25     COLDEFAULT=""
26    fi
27    
28  mage_setup()  mage_setup()
29  {  {
# Line 15  mage_setup() Line 38  mage_setup()
38   return 0   return 0
39  }  }
40    
41    mchecksum()
42    {
43     local i
44     local rundir
45     local file
46     local method
47     local cmd
48     local retval
49    
50     # very basic getops
51     for i in $*
52     do
53     case $1 in
54     --rundir|-r) shift; rundir="$1" ;;
55     --file|-f) shift; file="$1" ;;
56     --method|-m) shift; method="$1" ;;
57     esac
58     shift
59     done
60    
61     # sanity checks
62     [[ -z ${rundir} ]] && die "mchecksum(): rundir missing"
63     [[ -z ${file} ]] && die "mchecksum(): file missing"
64     [[ -z ${method} ]] && die "mchecksum(): method missing"
65    
66     case ${method} in
67     md5) cmd="md5sum" ;;
68     sha256) cmd="sha256sum" ;;
69     *) die "mchecksum(): unknown method '${method}'" ;;
70     esac
71    
72     if [[ -d ${rundir} ]]
73     then
74     pushd ${rundir} &> /dev/null
75     # be verbose here
76     ${cmd} -c ${file} #&> /dev/null
77     retval="$?"
78     popd &> /dev/null
79     else
80     retval=1
81     fi
82    
83     return "${retval}"
84    }
85    
86    mcheckemptydir()
87    {
88     local dir="$1"
89     local retval=1
90    
91     if [[ ! -d ${dir} ]]
92     then
93     echo "mcheckemptydir(): '${dir}' is not a directory!"
94     retval=3
95     else
96     shopt -s nullglob dotglob
97     files=( ${dir}/* )
98     (( ${#files[*]} )) || retval=0
99     shopt -u nullglob dotglob
100     fi
101    
102     return ${retval}
103    }
104    
105  unpack_packages()  unpack_packages()
106  {  {
107   local list="$@"   local list="$@"
# Line 23  unpack_packages() Line 110  unpack_packages()
110   local pkgtype   local pkgtype
111   local count_current   local count_current
112   local count_total   local count_total
113     local tar_opts
114    
115   # get count of total packages   # get count of total packages
116   declare -i count_current=0   declare -i count_current=0
# Line 54  unpack_packages() Line 142  unpack_packages()
142   continue   continue
143   fi   fi
144    
145     # busybox?
146     if need_busybox_support tar
147     then
148     tar_opts="xjf"
149     else
150     tar_opts="xjmf"
151     fi
152    
153   echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... "   echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... "
154   tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"   tar ${tar_opts} ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"
155   done   done
156    
157   # add a crlf for a better view   # add a crlf for a better view
# Line 75  fix_mtime() Line 171  fix_mtime()
171   mtime=$(stat -c %Y "${reference}")   mtime=$(stat -c %Y "${reference}")
172   touch \   touch \
173   --no-create \   --no-create \
174     --no-dereference \
175   --time=mtime \   --time=mtime \
176   --reference "${reference}" \   --reference="${reference}" \
177   "${pathto}"   "${pathto}"
178    
179   echo "${mtime}"   echo "${mtime}"
# Line 130  install_directories() Line 227  install_directories()
227   while read pathto posix user group   while read pathto posix user group
228   do   do
229   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
230   [[ ${VERBOSE} = on ]] && echo -e "\t>>> DIR:  ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> DIR:  ${MROOT}${pathto}"
   
231    
232   # monitors /etc/env.d -> env-rebuild   # monitors /etc/env.d -> env-rebuild
233   [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true   [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
# Line 198  install_files() Line 294  install_files()
294   is_config_protected "${pathto}"   is_config_protected "${pathto}"
295   retval="$?"   retval="$?"
296    
297   # 0 - not protected        #   # 0 - not protected         #
298   # 1 - error                #   # 1 - error                 #
299   # 2 - protected            #   # 2 - protected             #
300   # 3 - protected but masked #   # 3 - protected but masked  #
301     # 4 - protected but ignored #
302    
303   case ${retval} in   case ${retval} in
304   # file is not protected - (over)write it   # file is not protected - (over)write it
305   0|3)   0|3)
306   [[ ${VERBOSE} = on ]] && echo -e "\t>>> FILE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> FILE: ${MROOT}${pathto}"
307   install -m "${posix}" -o "${user}" -g "${group}" \   install -m "${posix}" -o "${user}" -g "${group}" \
308   ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \   ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
309   "${MROOT}${pathto}"   "${MROOT}${pathto}"
# Line 218  install_files() Line 315  install_files()
315   "${user}" \   "${user}" \
316   "${group}" \   "${group}" \
317   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
318   "${MROOT}${pathto}")" \   "${MROOT}${pathto}")" \
319   "${md5sum}"   "${md5sum}"
320   ;;   ;;
321    
322   # file is protected, write backup file   # file is protected, write backup file
323   2)   2)
324   if [[ ${VERBOSE} = on ]]   if mqueryfeature "verbose"
325   then   then
326   echo -en "${COLRED}"   echo -en "${COLRED}"
327   echo -n "! prot "   echo -n "! prot "
# Line 245  install_files() Line 342  install_files()
342   "${user}" \   "${user}" \
343   "${group}" \   "${group}" \
344   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
345   "${dest_protected}")" \   "${dest_protected}")" \
346   "${md5sum}"   "${md5sum}"
347    
348   # update global MAGE_PROTECT_COUNTER   # update global MAGE_PROTECT_COUNTER
349   (( MAGE_PROTECT_COUNTER++ ))   (( MAGE_PROTECT_COUNTER++ ))
350   export MAGE_PROTECT_COUNTER   export MAGE_PROTECT_COUNTER
351   ;;   ;;
352    
353     # file is protected but ignored, delete the update/do nothing
354     4)
355     if mqueryfeature "verbose"
356     then
357     echo -en "${COLRED}"
358     echo -n "! ignr "
359     echo -en "${COLDEFAULT}"
360     echo " === FILE: ${MROOT}${pathto}"
361     fi
362     # simply do nothing here - only fix mtime
363     fix_descriptor ${pkgname}/.files \
364     "${pathto}" \
365     "${posix}" \
366     "${user}" \
367     "${group}" \
368     "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
369     "${MROOT}${pathto}")" \
370     "${md5sum}"
371     ;;
372   esac   esac
373   done < ${BUILDDIR}/${pkgname}/.files   done < ${BUILDDIR}/${pkgname}/.files
374    
# Line 294  install_symlinks() Line 411  install_symlinks()
411   while read pathto posix link mtime   while read pathto posix link mtime
412   do   do
413   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
414   [[ ${VERBOSE} = on ]] && echo -e "\t>>> LINK: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> LINK: ${MROOT}${pathto}"
415    
416   ln -snf "${link}" "${MROOT}${pathto}"   ln -snf "${link}" "${MROOT}${pathto}"
417    
418   # fix mtime and db   # fix mtime and db
419   fix_descriptor ${pkgname}/.symlinks \   fix_descriptor ${pkgname}/.symlinks \
420   "${pathto}" \   "${pathto}" \
421   "${posix}" \   "${posix}" \
422   "${link}" \   "${link}" \
423   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \   "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
424   "${MROOT}${pathto}")"   "${MROOT}${pathto}")"
425    
426   done < ${BUILDDIR}/${pkgname}/.symlinks   done < ${BUILDDIR}/${pkgname}/.symlinks
427    
428   # now copy the fixed file over the old one  # # now copy the fixed file over the old one
429   [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \  # [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \
430   cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}  # cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}
431    
432   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
433   IFS=$'\n'   IFS=$'\n'
# Line 326  install_blockdevices() Line 443  install_blockdevices()
443   local pkgname="$1"   local pkgname="$1"
444   local pathto   local pathto
445   local posix   local posix
446     local user
447     local group
448   local IFS   local IFS
449    
450   # sanity checks; abort if not given   # sanity checks; abort if not given
# Line 339  install_blockdevices() Line 458  install_blockdevices()
458   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
459   IFS=§   IFS=§
460    
461   while read pathto posix   while read pathto posix major minor user group
462   do   do
463   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
464   [[ ${VERBOSE} = on ]] && echo -e "\t>>> PIPE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> PIPE: ${MROOT}${pathto}"
465    
466   mkfifo -m "${posix}" "${MROOT}$pathto"   mknod -m "${posix}" "${MROOT}${pathto}"
467     # make it optional atm !!
468     if [[ ! -z ${user} ]] && [[ ! -z ${group} ]]
469     then
470     chown "${user}:${group}" "${MROOT}${pathto}" b "${major}" "${minor}"
471     fi
472   done < ${BUILDDIR}/${pkgname}/.pipes   done < ${BUILDDIR}/${pkgname}/.pipes
473    
474   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
# Line 363  install_characterdevices() Line 487  install_characterdevices()
487   local posix   local posix
488   local major   local major
489   local minor   local minor
490     local user
491     local group
492   local IFS   local IFS
493    
494   # sanity checks; abort if not given   # sanity checks; abort if not given
# Line 376  install_characterdevices() Line 502  install_characterdevices()
502   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
503   IFS=§   IFS=§
504    
505   while read pathto posix major minor   while read pathto posix major minor user group
506   do   do
507   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
508   [[ ${VERBOSE} = on ]] && echo -e "\t>>> CHAR: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t>>> CHAR: ${MROOT}${pathto}"
509    
510   mknod -m ${posix} "${MROOT}${pathto}" c ${major} ${minor}   mknod -m ${posix} "${MROOT}${pathto}" b "${major}" "${minor}"
511    
512     # make it optional atm !!
513     if [[ ! -z ${user} ]] && [[ ! -z ${group} ]]
514     then
515     chown "${user}:${group}" "${MROOT}${pathto}"
516     fi
517   done < ${BUILDDIR}/${pkgname}/.char   done < ${BUILDDIR}/${pkgname}/.char
518    
519   # very important: unsetting the '§' fieldseperator   # very important: unsetting the '§' fieldseperator
520   IFS=$'\n'   IFS=$'\n'
521  }  }
522    
523    ###################################################
524    # function install_fifos                          #
525    # install_fifos $PKGNAME                    #
526    ###################################################
527    install_fifos()
528    {
529     local pkgname="$1"
530     local pathto
531     local posix
532     local user
533     local group
534     local IFS
535    
536     # sanity checks; abort if not given
537     [ -z "${pkgname}" ] && die "install_fifos() \$pkgname not given."
538    
539     # check needed global vars
540     [ -z "${BUILDDIR}" ] && die "install_fifos() \$BUILDDIR not set."
541    
542     # make it optional atm !!
543     #[ ! -f ${BUILDDIR}/${pkgname}/.fifo ] && die "install_fifos() .fifo not found"
544     [ ! -f ${BUILDDIR}/${pkgname}/.fifo ] && return
545    
546     # sets fieldseperator to "§" instead of " "
547     IFS=§
548    
549     while read pathto posix user group
550     do
551     [ -z "${pathto}" ] && continue
552     mqueryfeature "verbose" && echo -e "\t>>> FIFO: ${MROOT}${pathto}"
553    
554     mkfifo -m "${posix}" "${MROOT}${pathto}"
555     chown "${user}:${group}" "${MROOT}${pathto}"
556     done < ${BUILDDIR}/${pkgname}/.fifo
557    
558     # very important: unsetting the '§' fieldseperator
559     IFS=$'\n'
560    }
561    
562    
563  ###################################################  ###################################################
564  # function build_doinstall                        #  # function build_doinstall                        #
565  # build_doinstall $PKGNAME                  #  # build_doinstall $PKGNAME                  #
566  # NOTE: this is an wrapper do install packages    #  # NOTE: this is an wrapper to install packages    #
567  ###################################################  ###################################################
568  build_doinstall()  build_doinstall()
569  {  {
# Line 400  build_doinstall() Line 571  build_doinstall()
571    
572   # sanity checks; abort if not given   # sanity checks; abort if not given
573   [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."   [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."
574    
575   # this is only a wrapper   # this is only a wrapper
576    
577   # NOTE:   # NOTE:
# Line 415  build_doinstall() Line 586  build_doinstall()
586   install_symlinks ${pkgname} || die "install symlinks ${pkgname}"   install_symlinks ${pkgname} || die "install symlinks ${pkgname}"
587   install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"   install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"
588   install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"   install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"
589     install_fifos ${pkgname} || die "install fifos ${pkgname}"
590  }  }
591    
592    
# Line 476  install_database_entry() Line 648  install_database_entry()
648    
649   # create fake file descriptors   # create fake file descriptors
650   # used by virtual and source packages   # used by virtual and source packages
651   for i in .dirs .symlinks .files .pipes .char   for i in .dirs .symlinks .files .pipes .char .fifo
652   do   do
653   touch ${dbrecorddir}/${i}   touch ${dbrecorddir}/${i}
654   done   done
# Line 494  install_database_entry() Line 666  install_database_entry()
666    
667   # normal packages needs these files   # normal packages needs these files
668   local i   local i
669   for i in .char .dirs .files .pipes .symlinks   for i in .char .dirs .files .pipes .symlinks .fifo
670   do   do
671   install -m 0644 ${BUILDDIR}/${pkgname}/${i} \   # make .fifo optional atm
672   ${dbrecorddir}/${i}   if [[ -f ${BUILDDIR}/${pkgname}/${i} ]]
673     then
674     install -m 0644 ${BUILDDIR}/${pkgname}/${i} ${dbrecorddir}/${i}
675     fi
676   done   done
677   ;;   ;;
678   esac   esac
# Line 633  compare_mtime() Line 808  compare_mtime()
808    
809   mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"   mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"
810    
811   # if $pathto is a symlink than compare linked binary   # no extra handlink for symlinks anymore as fix_mtime
812   if [ -L "${MROOT}${pathto}" ]   # uses --no-dereference, compare directly
813   then   x=$(stat -c %Y "${MROOT}${pathto}")
  # readlink -f resolves full path of linked file  
  x="$(readlink -f "${MROOT}${pathto}")"  
   
  # abort if target does not exists  
  # we keep safe here, theoretically the link can removed  
  [ ! -e "${x}" ] && return 1  
   
  x=$(stat -c %Y "${x}")  
  else  
  x=$(stat -c %Y "${MROOT}${pathto}")  
  fi  
814    
815   [[ ${mtime} = ${x} ]] && return 0   [[ ${mtime} = ${x} ]] && return 0
816    
# Line 708  remove_symlinks() Line 872  remove_symlinks()
872   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
873   if [ ! -L "${MROOT}${pathto}" ]   if [ ! -L "${MROOT}${pathto}" ]
874   then   then
875   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
876   echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"   echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"
877   continue   continue
878   fi   fi
# Line 720  remove_symlinks() Line 884  remove_symlinks()
884   # 1=keep me   #   # 1=keep me   #
885   case ${retval} in   case ${retval} in
886   0)   0)
887   [[ ${VERBOSE} = on ]] && echo -e "\t<<< LINK: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< LINK: ${MROOT}${pathto}"
888   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
889   ;;   ;;
890    
891   1)   1)
892   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
893   echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"   echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"
894   ;;   ;;
895   esac   esac
# Line 772  remove_files() Line 936  remove_files()
936   done   done
937    
938   # sanity checks; abort if not given   # sanity checks; abort if not given
939   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_files() \$pcat not given."
940   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_files() \$pname not given."
941   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_files() \$pver not given."
942   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_files() \$pbuild not given."
943   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
944    
945   # check needed global vars   # check needed global vars
# Line 792  remove_files() Line 956  remove_files()
956    
957   if [ ! -e "${MROOT}${pathto}" ]   if [ ! -e "${MROOT}${pathto}" ]
958   then   then
959   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
960   echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"   echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"
961   continue   continue
962   fi   fi
# Line 809  remove_files() Line 973  remove_files()
973   is_config_protected "${pathto}"   is_config_protected "${pathto}"
974   retval="$?"   retval="$?"
975    
976   # 0 - not protected        #   # 0 - not protected         #
977   # 1 - error                #   # 1 - error                 #
978   # 2 - protected            #   # 2 - protected             #
979   # 3 - protected but masked #   # 3 - protected but masked  #
980     # 4 - protected but ignored #
981    
982   case ${retval} in   case ${retval} in
983   # file is not protected - delete it   # file is not protected - delete it
984   0|3)   0|3)
985   [[ ${VERBOSE} = on ]] && echo -e "\t<<< FILE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< FILE: ${MROOT}${pathto}"
986   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
987   ;;   ;;
988    
989   # file is protected, do not delete   # file is protected, do not delete
990   2)   2)
991   if [[ ${VERBOSE} = on ]]   if mqueryfeature "verbose"
992   then   then
993   echo -en "${COLRED}"   echo -en "${COLRED}"
994   echo -n "! prot "   echo -n "! prot "
# Line 831  remove_files() Line 996  remove_files()
996   echo " === FILE: ${MROOT}${pathto}"   echo " === FILE: ${MROOT}${pathto}"
997   fi   fi
998   ;;   ;;
999    
1000     # file is protected but ignored, delete the update/do nothing
1001     4)
1002     if mqueryfeature "verbose"
1003     then
1004     echo -en "${COLRED}"
1005     echo -n "! ignr "
1006     echo -en "${COLDEFAULT}"
1007     echo " === FILE: ${MROOT}${pathto}"
1008     fi
1009     # simply do nothing here
1010     ;;
1011   esac   esac
1012   ;;   ;;
1013   1)   1)
1014   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1015   echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"   echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"
1016   ;;   ;;
1017   esac   esac
# Line 853  remove_blockdevices() Line 1030  remove_blockdevices()
1030  {  {
1031   local pathto   local pathto
1032   local posix   local posix
1033     local user
1034     local group
1035   local IFS   local IFS
1036   local pcat   local pcat
1037   local pname   local pname
# Line 876  remove_blockdevices() Line 1055  remove_blockdevices()
1055   done   done
1056    
1057   # sanity checks; abort if not given   # sanity checks; abort if not given
1058   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_blockdevices() \$pcat not given."
1059   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_blockdevices() \$pname not given."
1060   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_blockdevices() \$pver not given."
1061   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_blockdevices() \$pbuild not given."
1062   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
1063    
1064   # check needed global vars   # check needed global vars
# Line 890  remove_blockdevices() Line 1069  remove_blockdevices()
1069   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
1070   IFS=§   IFS=§
1071    
1072   while read pathto posix   while read pathto posix user group
1073   do   do
1074   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
1075    
1076   [[ ${VERBOSE} = on ]] && echo -e "\t<<< PIPE: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< PIPE: ${MROOT}${pathto}"
1077   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
1078   done < ${MROOT}${INSTALLDB}/${pfull}/.pipes   done < ${MROOT}${INSTALLDB}/${pfull}/.pipes
1079    
# Line 911  remove_characterdevices() Line 1090  remove_characterdevices()
1090  {  {
1091   local pathto   local pathto
1092   local posix   local posix
1093     local user
1094     local group
1095   local IFS   local IFS
1096   local pcat   local pcat
1097   local pname   local pname
# Line 934  remove_characterdevices() Line 1115  remove_characterdevices()
1115   done   done
1116    
1117   # sanity checks; abort if not given   # sanity checks; abort if not given
1118   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_characterdevices() \$pcat not given."
1119   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_characterdevices() \$pname not given."
1120   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_characterdevices() \$pver not given."
1121   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_characterdevices() \$pbuild not given."
1122   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
1123    
1124   # check needed global vars   # check needed global vars
# Line 948  remove_characterdevices() Line 1129  remove_characterdevices()
1129   # sets fieldseperator to "§" instead of " "   # sets fieldseperator to "§" instead of " "
1130   IFS=§   IFS=§
1131    
1132   while read pathto posix   while read pathto posix user group
1133   do   do
1134   [ -z "${pathto}" ] && continue   [ -z "${pathto}" ] && continue
1135    
1136   [[ ${VERBOSE} = on ]] && echo -e "\t<<< CHAR: ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< CHAR: ${MROOT}${pathto}"
1137   rm "${MROOT}${pathto}"   rm "${MROOT}${pathto}"
1138   done < ${MROOT}${INSTALLDB}/${pfull}/.char   done < ${MROOT}${INSTALLDB}/${pfull}/.char
1139    
# Line 962  remove_characterdevices() Line 1143  remove_characterdevices()
1143    
1144    
1145  ###################################################  ###################################################
1146    # function remove_fifos                           #
1147    # remove_fifos $PKGNAME                     #
1148    ###################################################
1149    remove_fifos()
1150    {
1151     local pathto
1152     local posix
1153     local user
1154     local group
1155     local IFS
1156     local pcat
1157     local pname
1158     local pver
1159     local pbuild
1160     local i
1161     local pfull
1162    
1163     IFS=$'\n'
1164    
1165     # very basic getops
1166     for i in $*
1167     do
1168     case $1 in
1169     --pcat|-c) shift; pcat="$1" ;;
1170     --pname|-n) shift; pname="$1" ;;
1171     --pver|-v) shift; pver="$1" ;;
1172     --pbuild|-b) shift; pbuild="$1" ;;
1173     esac
1174     shift
1175     done
1176    
1177     # sanity checks; abort if not given
1178     [ -z "${pcat}" ] && die "remove_fifos() \$pcat not given."
1179     [ -z "${pname}" ] && die "remove_fifos() \$pname not given."
1180     [ -z "${pver}" ] && die "remove_fifos() \$pver not given."
1181     [ -z "${pbuild}" ] && die "remove_fifos() \$pbuild not given."
1182     pfull="${pcat}/${pname}-${pver}-${pbuild}"
1183    
1184     # check needed global vars
1185     [ -z "${BUILDDIR}" ] && die "remove_fifos() \$BUILDDIR not set."
1186    
1187     # make it optional atm !!
1188     #[ ! -f ${MROOT}${INSTALLDB}/${pfull}/.fifo ] && die "remove_fifos() .fifo not found"
1189     [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.fifo ] && return
1190    
1191     # sets fieldseperator to "§" instead of " "
1192     IFS=§
1193    
1194     while read pathto posix user group
1195     do
1196     [ -z "${pathto}" ] && continue
1197    
1198     mqueryfeature "verbose" && echo -e "\t<<< FIFO: ${MROOT}${pathto}"
1199     rm "${MROOT}${pathto}"
1200     done < ${MROOT}${INSTALLDB}/${pfull}/.fifo
1201    
1202     # very important: unsetting the '§' fieldseperator
1203     IFS=$'\n'
1204    }
1205    
1206    
1207    ###################################################
1208  # function remove_direcories                      #  # function remove_direcories                      #
1209  # remove_direcories $PKGNAME                #  # remove_direcories $PKGNAME                #
1210  ###################################################  ###################################################
# Line 992  remove_directories() Line 1235  remove_directories()
1235   done   done
1236    
1237   # sanity checks; abort if not given   # sanity checks; abort if not given
1238   [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."   [ -z "${pcat}" ] && die "remove_directories() \$pcat not given."
1239   [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."   [ -z "${pname}" ] && die "remove_directories() \$pname not given."
1240   [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."   [ -z "${pver}" ] && die "remove_directories() \$pver not given."
1241   [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."   [ -z "${pbuild}" ] && die "remove_directories() \$pbuild not given."
1242   pfull="${pcat}/${pname}-${pver}-${pbuild}"   pfull="${pcat}/${pname}-${pver}-${pbuild}"
1243    
1244   # check needed global vars   # check needed global vars
# Line 1013  remove_directories() Line 1256  remove_directories()
1256    
1257   if [ ! -d "${MROOT}${pathto}" ]   if [ ! -d "${MROOT}${pathto}" ]
1258   then   then
1259   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1260   echo -e "${COLRED}! exist${COLDEFAULT} === DIR:  ${MROOT}${pathto}"   echo -e "${COLRED}! exist${COLDEFAULT} === DIR:  ${MROOT}${pathto}"
1261   continue   continue
1262   fi   fi
# Line 1021  remove_directories() Line 1264  remove_directories()
1264   # exclude .keep directories   # exclude .keep directories
1265   if [ -f "${MROOT}${pathto}/.keep" ]   if [ -f "${MROOT}${pathto}/.keep" ]
1266   then   then
1267   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1268   echo -e "${COLRED}! .keep${COLDEFAULT} === DIR:  ${MROOT}${pathto}"   echo -e "${COLRED}! .keep${COLDEFAULT} === DIR:  ${MROOT}${pathto}"
1269   continue   continue
1270   fi   fi
# Line 1034  remove_directories() Line 1277  remove_directories()
1277    
1278   if rmdir "${MROOT}${pathto}" &> /dev/null   if rmdir "${MROOT}${pathto}" &> /dev/null
1279   then   then
1280   [[ ${VERBOSE} = on ]] && echo -e "\t<<< DIR:  ${MROOT}${pathto}"   mqueryfeature "verbose" && echo -e "\t<<< DIR:  ${MROOT}${pathto}"
1281   else   else
1282   [[ ${VERBOSE} = on ]] && \   mqueryfeature "verbose" && \
1283   echo -e "${COLRED}! empty${COLDEFAULT} === DIR:  ${MROOT}${pathto}"   echo -e "${COLRED}! empty${COLDEFAULT} === DIR:  ${MROOT}${pathto}"
1284   fi   fi
1285   done   done
# Line 1049  remove_directories() Line 1292  remove_directories()
1292  ###################################################  ###################################################
1293  # function build_douninstall                      #  # function build_douninstall                      #
1294  # build_douninstall $PKGNAME                #  # build_douninstall $PKGNAME                #
1295  # NOTE: this is an wrapper do remove packages     #  # NOTE: this is an wrapper to remove packages     #
1296  ###################################################  ###################################################
1297  build_douninstall()  build_douninstall()
1298  {  {
# Line 1083  build_douninstall() Line 1326  build_douninstall()
1326   # !! we use § as field seperator !!   # !! we use § as field seperator !!
1327   # doing so prevent us to get errors by filenames with spaces   # doing so prevent us to get errors by filenames with spaces
1328    
1329   for i in symlinks files blockdevices characterdevices directories   for i in symlinks files blockdevices characterdevices directories fifos
1330   do   do
1331   remove_${i} \   remove_${i} \
1332   --pcat "${pcat}" \   --pcat "${pcat}" \
# Line 1094  build_douninstall() Line 1337  build_douninstall()
1337   done   done
1338  }  }
1339    
1340    # convertmirrors [uri]
1341    convertmirrors()
1342    {
1343     local uri="$1"
1344     local scheme
1345     local mirror
1346     local mirrors
1347     local addon
1348     local real_uri
1349     local output
1350    
1351     # needs
1352     [[ -z ${MIRRORS} ]] && die "convertmirrors(): no mirrors defined!"
1353     [[ -z ${SOURCEFORGE_MIRRORS} ]] && die "convertmirrors(): no sourceforge mirrors defined!"
1354     [[ -z ${GNU_MIRRORS} ]] && die "convertmirrors(): no gnu mirrors defined!"
1355     [[ -z ${GNOME_MIRRORS} ]] && die "convertmirrors(): no gnome mirrors defined!"
1356     [[ -z ${KDE_MIRRORS} ]] && die "convertmirrors(): no kde mirrors defined!"
1357    
1358     # check known uri schemes
1359     case ${uri} in
1360     http://*|https://*|ftp://*|ftps://*) mirrors="" ;;
1361     mirror://*) mirrors="${MIRRORS}"; scheme="mirror://"; addon="/sources" ;;
1362     package://*) mirrors="${MIRRORS}"; scheme="package://"; addon="/${PACKAGES_SERVER_PATH}" ;;
1363     gnu://*) mirrors="${GNU_MIRRORS}"; scheme="gnu://" ;;
1364     sourceforge://*) mirrors="${SOURCEFORGE_MIRRORS}"; scheme="sourceforge://" ;;
1365     gnome://*) mirrors="${GNOME_MIRRORS}"; scheme="gnome://" ;;
1366     kde://*) mirrors="${KDE_MIRRORS}"; scheme="kde://" ;;
1367     *) die "convertmirror(): unsupported uri scheme in '${uri}'!" ;;
1368     esac
1369    
1370     if [[ ! -z ${mirrors} ]]
1371     then
1372     for mirror in ${mirrors}
1373     do
1374     # add a whitespace to the output
1375     [[ -z ${output} ]] || output+=" "
1376     output+="${mirror}${addon}/${uri/${scheme}/}"
1377     done
1378     else
1379     output="${uri}"
1380     fi
1381    
1382     echo "${output}"
1383    }
1384    
1385    mdownload()
1386    {
1387     local i
1388     local uri
1389     local real_uris
1390     local mirror
1391     local outputfile
1392     local outputdir
1393     local retval
1394     local wget_opts
1395    
1396     # very basic getops
1397     for i in $*
1398     do
1399     case $1 in
1400     --uri|-u) shift; uri="$1" ;;
1401     --dir|-d) shift; outputdir="$1" ;;
1402     esac
1403     shift
1404     done
1405    
1406     # sanity checks; abort if not given
1407     [[ -z ${uri} ]] && die "mdownload(): no uri given!"
1408     [[ -z ${outputdir} ]] && die "mdownload(): no dir given!"
1409    
1410     # convert mirrored uris to the real ones
1411     real_uris="$(convertmirrors ${uri})"
1412    
1413     # verbose or not
1414     mqueryfeature "!verbose" && wget_opts+=" --quiet"
1415    
1416     # filter wget options if busybox was found
1417     wget_opts+=" $(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1418    
1419     # create outputdir
1420     [[ ! -d ${outputdir} ]] && install -d "${outputdir}"
1421    
1422     for mirror in ${real_uris}
1423     do
1424     # get the name of the output file
1425     outputfile="${mirror##*/}"
1426    
1427     wget ${wget_opts} --output-document="${outputdir}/${outputfile}" "${mirror}"
1428     retval="$?"
1429     if [[ ${retval} = 0 ]]
1430     then
1431     break
1432     else
1433     continue
1434     fi
1435     done
1436    
1437     # return wget retval
1438     return "${retval}"
1439    }
1440    
1441  # fetch_packages /path/to/mage/file1 /path/to/mage/file2  # fetch_packages /path/to/mage/file1 /path/to/mage/file2
1442  fetch_packages()  fetch_packages()
1443  {  {
1444     local i
1445   local list="$@"   local list="$@"
1446   local pkg   local pkg
1447   local mirr   local mirr
# Line 1105  fetch_packages() Line 1450  fetch_packages()
1450   local opt   local opt
1451   local count_current   local count_current
1452   local count_total   local count_total
1453     local wget_opts
1454    
1455     [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your ${MAGERC}."
1456    
1457   [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your /etc/mage.rc."   # filter wget command if busybox was found
1458     wget_opts="$(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1459    
1460   # get count of total packages   # get count of total packages
1461   declare -i count_current=0   declare -i count_current=0
# Line 1146  fetch_packages() Line 1495  fetch_packages()
1495   continue   continue
1496   fi   fi
1497    
1498   for mirr in ${MIRRORS}   echo -ne " ${COLBLUE}***${COLDEFAULT}"
1499   do   echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "
1500   echo -ne " ${COLBLUE}***${COLDEFAULT}"   mdownload --uri "package://${pkg}" --dir "${PKGDIR}" || die "Could not download ${pkg}"
  #echo -e " fetching (${count_current}/${count_total}): ${mirr}/${pkg} ... "  
  echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "  
  [[ ${VERBOSE} = off ]] && opt="--quiet"  
  wget \  
  --passive-ftp \  
  --tries 3 \  
  --continue \  
  --progress bar \  
  --directory-prefix=${PKGDIR} \  
  ${opt} ${mirr}/${PACKAGES_SERVER_PATH}/${pkg}  
  if [[ $? = 0 ]]  
  then  
  break  
  else  
  continue  
  fi  
  done  
   
1501   if [ ! -f ${PKGDIR}/${pkg} ]   if [ ! -f ${PKGDIR}/${pkg} ]
1502   then   then
1503   die "Could not download ${pkg}"   die "Package '${pkg}' after download not found in '${PKGDIR}'"
1504   fi   fi
1505   done   done
1506    
# Line 1181  syncmage() Line 1512  syncmage()
1512  {  {
1513   if [ -z "${RSYNC}" ]   if [ -z "${RSYNC}" ]
1514   then   then
1515   die "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."   die "You have no rsync-mirrors defined. Please edit your ${MAGERC}."
1516   fi   fi
1517    
1518   local i   local i
1519   for i in ${RSYNC}   for i in ${RSYNC}
1520   do   do
1521   rsync \   rsync ${RSYNC_FETCH_OPTIONS} ${i} ${MAGEDIR}
  --recursive \  
  --links \  
  --perms \  
  --times \  
  --devices \  
  --timeout=600 \  
  --verbose \  
  --compress \  
  --progress \  
  --stats \  
  --delete \  
  --delete-after \  
  ${i} ${MAGEDIR}  
1522   if [[ $? = 0 ]]   if [[ $? = 0 ]]
1523   then   then
1524   break   break
# Line 1210  syncmage() Line 1528  syncmage()
1528   done   done
1529    
1530   # clean up backup files (foo~)   # clean up backup files (foo~)
1531   find ${MAGEDIR} -name *~ -exec rm '{}' ';'   find ${MAGEDIR} -name \*~ -exec rm '{}' ';'
1532    
1533   # check if an newer mage version is available   # check if a newer mage version is available
1534   is_newer_mage_version_available   is_newer_mage_version_available
1535  }  }
1536    
1537    syncmage_tarball()
1538    {
1539     local latest_tarball
1540     local latest_md5
1541     local temp="$(mktemp -d)"
1542     local mirr mymirr
1543     local opt
1544     local tar_opts
1545     local wget_opts
1546    
1547     # try to get the md5 marked as latest on the server
1548     latest_md5="mage-latest.md5"
1549    
1550     # try to get the tarball marked as latest on the server
1551     latest_tarball="mage-latest.tar.bz2"
1552    
1553     # filter wget command if busybox was found
1554     wget_opts="$(busybox_filter_wget_options ${WGET_FETCH_OPTIONS})"
1555    
1556     for mirr in ${MIRRORS}
1557     do
1558     # path without distribution
1559     # (only for stable|testing|unstable and not DISTROTAG)
1560     case ${mirr##*/} in
1561     stable|testing|unstable) mymirr="${mirr%/*}";;
1562     *) mymirr="${mirr}";;
1563     esac
1564    
1565     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1566     echo "fetching latest md5 from ${mymirr} ..."
1567     mqueryfeature "!verbose" && opt="--quiet"
1568     wget \
1569     ${wget_opts} \
1570     --directory-prefix=${temp} \
1571     ${opt} ${mymirr}/rsync/tarballs/${latest_md5}
1572    
1573     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1574     echo "fetching latest tarball from ${mymirr} ..."
1575     wget \
1576     ${wget_opts} \
1577     --directory-prefix=${temp} \
1578     ${opt} ${mymirr}/rsync/tarballs/${latest_tarball}
1579     if [[ $? = 0 ]]
1580     then
1581     break
1582     else
1583     continue
1584     fi
1585     done
1586    
1587     if [[ -f ${temp}/${latest_tarball} ]]
1588     then
1589     # check md5
1590     if [[ ! -f ${temp}/${latest_md5} ]]
1591     then
1592     die "md5 is missing ... aborting"
1593     else
1594     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1595     echo -n "checking md5sum... "
1596     mchecksum --rundir "${temp}" --file "${latest_md5}" --method md5 || die "md5 for ${latest_tarball} failed"
1597     fi
1598    
1599     if [[ -d ${MAGEDIR} ]]
1600     then
1601     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1602     echo "cleaning old mage-tree ${MAGEDIR}..."
1603     # honor mountpoints and empty dirs
1604     if mountpoint -q ${MAGEDIR}
1605     then
1606     if ! mcheckemptydir ${MAGEDIR}
1607     then
1608     find ${MAGEDIR} -mindepth 1 -maxdepth 1 | xarg --no-run-if-empty rm -r
1609     fi
1610     else
1611     rm -rf ${MAGEDIR}
1612     fi
1613     fi
1614    
1615     if need_busybox_support tar
1616     then
1617     tar_opts="xjf"
1618     else
1619     tar_opts="xjmf"
1620     fi
1621    
1622     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1623     echo "updating mage-tree from tarball ..."
1624     # unpack in dirname of MAGEDIR, as the tarball has already the mage
1625     tar ${tar_opts} ${temp}/${latest_tarball} -C ${MAGEDIR%/*} || die "Unpacking tarball"
1626    
1627     if [[ -d ${temp} ]]
1628     then
1629     echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1630     echo "cleaning temp-files ..."
1631     rm -rf ${temp}
1632     fi
1633    
1634     # check if a newer mage version is available
1635     is_newer_mage_version_available
1636     else
1637     die "Could not fetch the latest tarball ... aborting"
1638     fi
1639    }
1640    
1641  cleanpkg()  cleanpkg()
1642  {  {
1643   if [ -d "${PKGDIR}" ]   if [ -d "${PKGDIR}" ]
# Line 1246  xtitleclean() Line 1668  xtitleclean()
1668  }  }
1669    
1670    
1671  # cuts full pathnames or versioniezed names down to basename  # unused?
1672  choppkgname()  #
1673  {  # # cuts full pathnames or versionized names down to basename
1674   #we want this only if full name was used  # choppkgname()
1675   if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]  # {
1676   then  # #we want this only if full name was used
1677   #cuts ARCH and PBUILD  # if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1678   #ARCH comes from /etc/mage.rc  # then
1679   MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")  # #cuts ARCH and PBUILD
1680    # #ARCH comes from ${MAGERC}
1681    # MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}$(print_distrotag)-r*.::g")
1682    #
1683    # #cuts version number
1684    # MAGENAME=$(basename ${MAGENAME%-*} .mage)
1685    # fi
1686    # }
1687    
  #cuts version number  
  MAGENAME=$(basename ${MAGENAME%-*} .mage)  
  fi  
 }  
1688    
1689  # get_categorie $PNAME, returns CATEGORIE  # get_categorie $PNAME, returns CATEGORIE
1690  # $1=pname  # $1=pname
# Line 1286  pname2pcat() Line 1711  pname2pcat()
1711  # returns 0=stable 1=unstable  # returns 0=stable 1=unstable
1712  check_stable_package()  check_stable_package()
1713  {  {
1714     # first check if this magefile is not blacklisted
1715     blacklisted "$1" || return 1
1716    
1717   local STATE   local STATE
1718   STATE="$(get_value_from_magefile STATE "$1")"   STATE="$(get_value_from_magefile STATE "$1")"
1719    
# Line 1325  get_highest_magefile() Line 1753  get_highest_magefile()
1753   local PNAME="$2"   local PNAME="$2"
1754   local magefile   local magefile
1755    
1756   for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*)   # do not list the content of a directory, only the name (-d)
1757     for magefile in $(ls --format=single-column -v -d ${MAGEDIR}/${PCAT}/${PNAME}/* 2> /dev/null)
1758   do   do
1759     [[ -z ${magefile} ]] && continue
1760   # we exclude subdirs (for stuff like a md5sum dir)   # we exclude subdirs (for stuff like a md5sum dir)
1761   [ -d ${magefile} ] && continue   [[ -d ${magefile} ]] && continue
1762   if check_stable_package ${magefile}   if check_stable_package ${magefile}
1763   then   then
1764   HIGHEST_MAGEFILE=${magefile}   HIGHEST_MAGEFILE=${magefile}
1765   #for debug only   #for debug only
1766   [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"   mqueryfeature "debug" && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1767   fi   fi
1768   done   done
1769    
  # stop here if HIGHEST_MAGEFILE is zero  
  # this package must be unstable or old  
  if [ -z "${HIGHEST_MAGEFILE}" ]  
  then  
  echo  
  echo -n "All packages named "  
  echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}  
  echo -n " are marked "  
  echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}  
  echo "."  
  echo "You need to declare USE_UNSTABLE=true to install this."  
  echo  
  echo "Example:"  
  echo "         USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"  
  echo  
  echo "Be warned that these packages are not stable and may cause serious problems."  
  echo "You should know what you are doing, so don't complain about any damage."  
  echo  
  return 1  
  fi  
   
1770   echo "${HIGHEST_MAGEFILE}"   echo "${HIGHEST_MAGEFILE}"
1771   return 0   return 0
1772  }  }
# Line 1372  get_highest_magefile() Line 1781  get_highest_magefile()
1781  #        1 - error                                #  #        1 - error                                #
1782  #        2 - protected                            #  #        2 - protected                            #
1783  #        3 - protected but masked                 #  #        3 - protected but masked                 #
1784    #        4 - protected but ignored                #
1785  #                                                 #  #                                                 #
1786  ###################################################  ###################################################
1787  is_config_protected()  is_config_protected()
# Line 1380  is_config_protected() Line 1790  is_config_protected()
1790   local TEST   local TEST
1791   local PROTECTED   local PROTECTED
1792   local IFS   local IFS
1793     local i
1794     local x
1795    
1796   EXPFILE="${MROOT}$1"   EXPFILE="${MROOT}$1"
1797    
1798   # file does not exist; it can be written   # file does not exist; it can be written
1799   [ ! -e ${EXPFILE} ] && return 0   [[ ! -e ${EXPFILE} ]] && return 0
1800    
1801   # to be safe; it may be '§'   # to be safe; it may be '§'
1802   IFS=' '   IFS=' '
1803    
1804   # check ob in config protect   # check if config protected
1805   for i in ${CONFIG_PROTECT}   for i in ${CONFIG_PROTECT}
1806   do   do
1807   # ersetzen von $i nur wenn am anfang der variable   # only replace $i in the beginning of the variable
1808   TEST="${EXPFILE/#${MROOT}${i}/Protected}"   TEST="${EXPFILE/#${MROOT}${i}/Protected}"
1809   if [ "${TEST}" != "${EXPFILE}" ]   if [[ ${TEST} != ${EXPFILE} ]]
1810   then   then
1811   # setzen das es protected ist   # file is config proteced
1812   PROTECTED=TRUE   PROTECTED=TRUE
1813    
1814   # check ob nicht doch maskiert   # check if not masked
1815   for x in ${CONFIG_PROTECT_MASK}   for x in ${CONFIG_PROTECT_MASK}
1816   do   do
1817   TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"   TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"
1818   if [ "${TEST}" != "${EXPFILE}" ]   if [[ ${TEST} != ${EXPFILE} ]]
1819   then   then
1820   PROTECTED=MASKED   PROTECTED=MASKED
1821   fi   fi
1822   done   done
1823    
1824     # check if not ignored
1825     for x in ${CONFIG_PROTECT_IGNORE}
1826     do
1827     TEST="${EXPFILE/#${MROOT}${x}/Protect_Ignored}"
1828     if [[ ${TEST} != ${EXPFILE} ]]
1829     then
1830     PROTECTED=IGNORED
1831     fi
1832     done
1833   fi   fi
1834   done   done
1835    
# Line 1422  is_config_protected() Line 1844  is_config_protected()
1844   #echo "I'm protected, but masked - delete me"   #echo "I'm protected, but masked - delete me"
1845   return 3   return 3
1846   ;;   ;;
1847     IGNORED)
1848     #echo "I'm protected, but ignored - keep me, del update"
1849     return 4
1850     ;;
1851   *)   *)
1852   #echo "delete me"   #echo "delete me"
1853   return 0   return 0
# Line 1439  is_config_protected() Line 1865  is_config_protected()
1865  ###################################################  ###################################################
1866  count_protected_files()  count_protected_files()
1867  {  {
1868   ${MLIBDIR}/writeprotected "$1"   local file="$1"
1869     local dirname="${file%/*}"
1870     local filename="${file##*/}"
1871     local count
1872     local output
1873     local i
1874    
1875     declare -i count=0
1876    
1877     # check if there are already protected files
1878     for oldpretected in $(find ${dirname} -iname "._cfg????_${filename}" |
1879     sed -e "s:\(^.*/\)\(._cfg*_\)\(/.*$\):\1\2\3\%\2\%\3:" |
1880     sort -t'%' -k3 -k2 | cut -f1 -d'%')
1881     do
1882     count=$(echo ${oldpretected} | cut -d_ -f2 | sed -e "s:cfg::")
1883     done
1884     (( count ++ ))
1885    
1886     # fill output up with zeros
1887     for (( i=${#count}; i < 4; i++ )); do output="${output}0"; done
1888     output="${output}${count}"
1889    
1890     echo "${output}"
1891  }  }
1892    
1893  # call with  # call with
# Line 1456  get_uninstall_candidates() Line 1904  get_uninstall_candidates()
1904   local list   local list
1905   local pcatdir   local pcatdir
1906   local protected   local protected
1907     local i
1908    
1909   # very basic getops   # very basic getops
1910   for i in $*   for i in $*
# Line 1610  virtuals_add() Line 2059  virtuals_add()
2059    
2060  #deletes pakages from virtual database  #deletes pakages from virtual database
2061  #$1 virtualname; $2 pkgname  #$1 virtualname; $2 pkgname
2062  virtuals_del() {  virtuals_del()
2063    {
2064    
2065   local virtualname="$1"   local virtualname="$1"
2066   local pkgname="$2"   local pkgname="$2"
# Line 1717  minclude() Line 2167  minclude()
2167  {  {
2168   local i   local i
2169    
2170   if [ -n "$@" ]   if [[ -n $* ]]
2171   then   then
2172   for i in $@   for i in $*
2173   do   do
2174   [[ ${MAGEDEBUG} = on ]] && \   mqueryfeature "debug" && \
2175   echo "--- Including ${MAGEDIR}/include/${i}.minc"   echo "--- Including ${MAGEDIR}/include/${i}.minc"
2176   source ${MAGEDIR}/include/${i}.minc   source ${MAGEDIR}/include/${i}.minc
2177   done   done
2178   [[ ${MAGEDEBUG} = on ]] && echo   mqueryfeature "debug" && echo
2179   fi   fi
2180  }  }
2181    
# Line 1733  sminclude() Line 2183  sminclude()
2183  {  {
2184   local i   local i
2185    
2186   if [ -n "$@" ]   if [[ -n $* ]]
2187   then   then
2188   for i in $@   for i in $*
2189   do   do
2190   echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"   echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
2191   source ${SMAGESCRIPTSDIR}/include/${i}.sminc   source ${SMAGESCRIPTSDIR}/include/${i}.sminc
# Line 1759  is_newer_mage_version_available() Line 2209  is_newer_mage_version_available()
2209   echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}   echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
2210   echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}   echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
2211   echo "It is recommened to install this newer version"   echo "It is recommened to install this newer version"
2212   echo "or your current system installation may brake."   echo "or your current system installation may break."
2213   echo   echo
2214   echo -en "Please update mage by running "   echo -en "Please update mage by running "
2215   echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}   echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
# Line 2031  get_value_from_magefile() Line 2481  get_value_from_magefile()
2481   local magefile="$2"   local magefile="$2"
2482   local value   local value
2483    
2484     [[ -z ${var} ]] && return 1
2485     [[ -z ${magefile} ]] && return 1
2486    
2487   # local all possible vars of a mage file   # local all possible vars of a mage file
2488   # to prevent bad issues   # to prevent bad issues
2489   local PKGNAME   local PKGNAME
# Line 2041  get_value_from_magefile() Line 2494  get_value_from_magefile()
2494   local SDEPEND   local SDEPEND
2495   local PROVIDE   local PROVIDE
2496   local PKGTYPE   local PKGTYPE
2497     local MAGE_TARGETS
2498     local SPLIT_PACKAGE_BASE
2499   local preinstall   local preinstall
2500   local postinstall   local postinstall
2501   local preremove   local preremove
# Line 2087  mage_install() Line 2542  mage_install()
2542   local count_current   local count_current
2543   local magefile   local magefile
2544   local src_install   local src_install
2545     local i
2546    
2547   # very basic getops   # very basic getops
2548   for i in $*   for i in $*
# Line 2160  mage_install() Line 2616  mage_install()
2616   echo B:${pbuild}   echo B:${pbuild}
2617   fi   fi
2618    
2619   smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2   if [[ -n ${MAGE_TARGETS} ]]
2620     then
2621     # basic svn compat
2622     if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2623     then
2624     for i in ${SMAGESCRIPTSDIR}/*/${pname/${MAGE_TARGETS}/}/${pname/${MAGE_TARGETS}/}-${pver}-${pbuild}.smage2
2625     do
2626     smage2file="${i}"
2627     done
2628     else
2629     smage2file=${SMAGESCRIPTSDIR}/${pname/${MAGE_TARGETS}/}/${pname/${MAGE_TARGETS}/}-${pver}-${pbuild}.smage2
2630     fi
2631    
2632     elif [[ -n ${SPLIT_PACKAGE_BASE} ]]
2633     then
2634     # basic svn compat
2635     if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2636     then
2637     for i in ${SMAGESCRIPTSDIR}/*/${SPLIT_PACKAGE_BASE}/${SPLIT_PACKAGE_BASE}-${pver}-${pbuild}.smage2
2638     do
2639     smage2file="${i}"
2640     done
2641     else
2642     smage2file=${SMAGESCRIPTSDIR}/${SPLIT_PACKAGE_BASE}/${SPLIT_PACKAGE_BASE}-${pver}-${pbuild}.smage2
2643     fi
2644    
2645     else
2646     # basic svn compat
2647     if [[ -d ${SMAGESCRIPTSDIR}/.svn ]]
2648     then
2649     for i in ${SMAGESCRIPTSDIR}/*/${pname}/${pname}-${pver}-${pbuild}.smage2
2650     do
2651     smage2file="${i}"
2652     done
2653     else
2654     smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2655     fi
2656     fi
2657    
2658   if [ -f "${smage2file}" ]   if [ -f "${smage2file}" ]
2659   then   then
2660     echo -e " ${COLBLUE}***${COLDEFAULT} building package from source ... "
2661   smage2 ${smage2file} || die "compile failed"   smage2 ${smage2file} || die "compile failed"
2662   else   else
2663   echo   echo
# Line 2176  mage_install() Line 2671  mage_install()
2671   if [[ ${PKGTYPE} != virtual ]] && \   if [[ ${PKGTYPE} != virtual ]] && \
2672   [[ ${PKGTYPE} != sources ]]   [[ ${PKGTYPE} != sources ]]
2673   then   then
2674   # show a verbose message on src-install   echo -e " ${COLBLUE}***${COLDEFAULT} merging files into system ... "
  if [[ ${src_install} = true ]]  
  then  
  echo -ne "${COLBLUE} *** ${COLDEFAULT}"  
  echo -ne "merging files: "  
  echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"  
  echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"  
  fi  
2675   build_doinstall ${PKGNAME}   build_doinstall ${PKGNAME}
2676   fi   fi
2677    
# Line 2297  md5sum_packages() Line 2785  md5sum_packages()
2785   then   then
2786   echo -ne "${COLBLUE} *** ${COLDEFAULT}"   echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2787   echo -ne "checking md5sum (${count_current}/${count_total}): "   echo -ne "checking md5sum (${count_current}/${count_total}): "
2788   ( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed"   mchecksum --rundir "${PKGDIR}" --file "${md5file}" --method md5 || die "md5 for ${pkgfile} failed"
2789   else   else
2790   echo -ne "${COLBLUE} --- ${COLDEFAULT}"   echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2791   echo -e "!! no md5sum file found for ${pkgfile} :("   echo -e "!! no md5sum file found for ${pkgfile} :("
# Line 2440  mage_uninstall() Line 2928  mage_uninstall()
2928   echo -ne "${COLBLUE} <<< ${COLDEFAULT}"   echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2929   echo -n "removing: "   echo -n "removing: "
2930   echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"   echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2931   echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"   echo -e "${COLRED}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2932    
2933   magefile="${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"   magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2934   source ${magefile}   source ${magefile}
2935    
2936   ## preremove scripts   ## preremove scripts
# Line 2510  mage_uninstall() Line 2998  mage_uninstall()
2998   unset -f postremove   unset -f postremove
2999  }  }
3000    
3001  show_etc_update_mesg() {  show_etc_update_mesg()
3002    {
3003   [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0   [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
3004    
3005   echo   echo
# Line 2536  pkgsearch() Line 3025  pkgsearch()
3025   local state   local state
3026   local descriptiom   local descriptiom
3027   local homepage   local homepage
3028     local license
3029   local i   local i
3030   local all_installed   local all_installed
3031   local ipver   local ipver
3032   local ipbuild   local ipbuild
3033     local latest_available
3034     local depsfull
3035     local sdepsfull
3036     local deps
3037     local sdeps
3038     local dep
3039     local sign
3040    
3041   # only names no versions   # only names no versions
3042   result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name '*'${string}'*')"   result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name '*'${string}'*'| sed '/profiles/d' | sed '/includes/d')"
3043   #result="$(find ${MAGEDIR} -type f -name '*'${string}'*'.mage | sort)"   #result="$(find ${MAGEDIR} -type f -name '*'${string}'*'.mage | sort)"
3044    
3045   # nothing found   # nothing found
# Line 2557  pkgsearch() Line 3054  pkgsearch()
3054   # get highest version available   # get highest version available
3055   magefile=$(get_highest_magefile ${pcat} ${pname})   magefile=$(get_highest_magefile ${pcat} ${pname})
3056    
3057   # now get all needed infos to print a nice output   if [[ ! -z ${magefile} ]]
3058   pver="$(magename2pver ${magefile})"   then
3059   pbuild="$(magename2pbuild ${magefile})"   # now get all needed infos to print a nice output
3060   state="$(get_value_from_magefile STATE ${magefile})"   pver="$(magename2pver ${magefile})"
3061   description="$(get_value_from_magefile DESCRIPTION ${magefile})"   pbuild="$(magename2pbuild ${magefile})"
3062   homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"   state="$(get_value_from_magefile STATE ${magefile})"
3063     description="$(get_value_from_magefile DESCRIPTION ${magefile})"
3064     homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
3065     license="$(get_value_from_magefile LICENSE ${magefile})"
3066    
3067   # all installed   # all installed
3068   for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})   for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
3069   do   do
3070   ipver="$(magename2pver ${i})"   ipver="$(magename2pver ${i})"
3071   ipbuild="$(magename2pbuild ${i})"   ipbuild="$(magename2pbuild ${i})"
3072    
3073   if [[ -z ${all_installed} ]]   if [[ -z ${all_installed} ]]
3074   then   then
3075   all_installed="${ipver}-${ipbuild}"   all_installed="${ipver}-${ipbuild}"
3076   else   else
3077   all_installed="${all_installed} ${ipver}-${ipbuild}"   all_installed="${all_installed} ${ipver}-${ipbuild}"
3078   fi   fi
3079   done   done
3080   [[ -z ${all_installed} ]] && all_installed="none"   [[ -z ${all_installed} ]] && all_installed="none"
3081    
3082   case ${state} in   case ${state} in
3083   stable) state=${COLGREEN}"[s] ";;   stable) state=${COLGREEN}"[s] ";;
3084   testing) state=${COLYELLOW}"[t] ";;   testing) state=${COLYELLOW}"[t] ";;
3085   unstable) state=${COLRED}"[u] ";;   unstable) state=${COLRED}"[u] ";;
3086   old) state=${COLGRAY}"[o] ";;   old) state=${COLGRAY}"[o] ";;
3087   esac   esac
3088    
3089     latest_available="${pver}-${pbuild}"
3090     else
3091     # package is masked
3092     state="${COLRED}[m] "
3093     latest_available="${COLRED}masked for this distribution.${COLDEFAULT}"
3094     fi
3095    
3096     depsfull="$(get_value_from_magefile DEPEND ${magefile})"
3097     sdepsfull="$(get_value_from_magefile SDEPEND ${magefile})"
3098    
3099     while read sign dep
3100     do
3101     case ${dep} in
3102     "") continue;;
3103     esac
3104    
3105     deps="${deps} $(basename ${dep%-*})"
3106     done << EOF
3107    ${depsfull}
3108    EOF
3109    
3110     while read sign dep
3111     do
3112     case ${dep} in
3113     "") continue;;
3114     esac
3115    
3116     sdeps="${sdeps} $(basename ${dep%-*})"
3117     done << EOF
3118    ${sdepsfull}
3119    EOF
3120    
3121   echo -e "${state}${pcat}/${pname}"${COLDEFAULT}   echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
3122   echo "      Latest available:   ${pver}-${pbuild}"   echo -e "      Latest available:   ${latest_available}"
3123   echo "      Installed versions: ${all_installed}"   echo "      Installed versions: ${all_installed}"
3124   echo "      Description: ${description}"   echo "      Description: ${description}"
3125   echo "      Homepage: ${homepage}"   echo "      Homepage: ${homepage}"
3126     if [[ ! -z ${license} ]]
3127     then
3128     echo "      License:  ${license}"
3129     fi
3130     echo "      Depends: ${deps}"
3131     echo "      SDepends: ${sdeps}"
3132   echo   echo
3133    
3134   unset pcat   unset pcat
# Line 2604  pkgsearch() Line 3142  pkgsearch()
3142   unset all_installed   unset all_installed
3143   unset ipver   unset ipver
3144   unset ipbuild   unset ipbuild
3145     unset depsfull
3146     unset sdepsfull
3147     unset deps
3148     unset sdeps
3149     unset dep
3150     unset sign
3151   done   done
3152  }  }
3153    
# Line 2623  export_inherits() Line 3167  export_inherits()
3167   eval "${functions}() { ${include}_${functions} ; }"   eval "${functions}() { ${include}_${functions} ; }"
3168    
3169   # debug   # debug
3170   [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"   mqueryfeature "debug" && typeset -f "${functions}"
3171    
3172   shift   shift
3173   done   done
3174  }  }
3175    
3176    mlibdir()
3177    {
3178     local libdir=lib
3179     [[ ${ARCH} = x86_64 ]] && libdir=lib64
3180    
3181     echo "${libdir}"
3182    }
3183    
3184    ## blacklisted ${magefile}
3185    blacklisted()
3186    {
3187     [[ -z ${MAGE_DISTRIBUTION} ]] && local MAGE_DISTRIBUTION=stable
3188    
3189     # compat
3190     [[ ${USE_UNSTABLE} = true ]] && local MAGE_DISTRIBUTION=unstable
3191     [[ ${USE_TESTING} = true ]] && local MAGE_DISTRIBUTION=testing
3192    
3193     # support both types for the moment
3194     if [[ -f /etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION} ]]
3195     then
3196     local EXCLUDED="/etc/mage-profile/package.blacklist-${ARCH}-${MAGE_DISTRIBUTION}"
3197     else
3198     local EXCLUDED="/etc/mage-profile/package.blacklist-${ARCH}"
3199     fi
3200    
3201     # return 0 if the list not exist; nothin is masked
3202     [[ ! -f ${EXCLUDED} ]] && return 0
3203    
3204     local MAGEFILE="$1"
3205    
3206     local PCAT="$(magename2pcat ${MAGEFILE})"
3207     local PNAME="$(magename2pname ${MAGEFILE})"
3208     local PVER="$(magename2pver ${MAGEFILE})"
3209     local PBUILD="$(magename2pbuild ${MAGEFILE})"
3210    
3211     local EXPCAT EXPNAME EXPVER EXPBUILD
3212     while read EXPCAT EXPNAME EXPVER EXPBUILD
3213     do
3214     # ignore spaces and comments
3215             case "${EXPCAT}" in
3216                     \#*|"") continue ;;
3217             esac
3218    
3219     # exclude full pver
3220     if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
3221     [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
3222     [[ -n ${PVER} ]] && [[ -n ${PBUILD} ]] &&
3223     [[ -n ${EXPVER} ]] && [[ -n ${EXPBUILD} ]]
3224     then
3225     [[ ${EXPCAT}/${EXPNAME}-${EXPVER}-${EXPBUILD} = ${PCAT}/${PNAME}-${PVER}-${PBUILD} ]] && return 1
3226     fi
3227    
3228     # exclude pcat/pname only
3229     if [[ -n ${PCAT} ]] && [[ -n ${PNAME} ]] &&
3230     [[ -n ${EXPCAT} ]] && [[ -n ${EXPNAME} ]] &&
3231     [[ -z ${EXPVER} ]] && [[ -z ${EXPBUILD} ]]
3232     then
3233     [[ ${EXPCAT}/${EXPNAME} = ${PCAT}/${PNAME} ]] && return 1
3234     fi
3235     done << EOF
3236    $( cat ${EXCLUDED}; echo)
3237    EOF
3238    
3239     return 0
3240    }
3241    
3242    # need_busybox_support ${cmd}
3243    # return 0 (no error = needs busybox support) or return 1 (error = no busybox support required)
3244    need_busybox_support()
3245    {
3246     local cmd
3247     cmd="$1"
3248    
3249     if [[ -x /bin/busybox ]]
3250     then
3251     if [[ $(readlink $(which ${cmd})) = /bin/busybox ]]
3252     then
3253     # needs busybox support
3254     return 0
3255     fi
3256     fi
3257    
3258     # no busybox
3259     return 1
3260    }
3261    
3262    # busybox_filter_wget_options ${wget_opts}
3263    busybox_filter_wget_options()
3264    {
3265     local opts="$@"
3266     local i
3267     local fixed_opts
3268    
3269     if need_busybox_support wget
3270     then
3271     for i in ${opts}
3272     do
3273     # show only the allowed ones
3274     case ${i} in
3275     -c|--continue) fixed_opts+=" -c" ;;
3276     -s|--spider) fixed_opts+=" -s" ;;
3277     -q|--quiet) fixed_opts+=" -q" ;;
3278     -O|--output-document) shift; fixed_opts+=" -O $1" ;;
3279     --header) shift; fixed_opts+=" --header $1" ;;
3280     -Y|--proxy) shift; fixed_opts+=" -Y $1" ;;
3281     -P) shift; fixed_opts+=" -P $1" ;;
3282     --no-check-certificate) fixed_opts+=" --no-check-certificate ${i}" ;;
3283     -U|--user-agent) shift; fixed_opts+=" -U ${i}" ;;
3284     # simply drop all other opts
3285     *) continue ;;
3286     esac
3287     done
3288    
3289     echo "${fixed_opts}"
3290     else
3291     echo "${opts}"
3292     fi
3293    }
3294    
3295    have_root_privileges()
3296    {
3297     local retval
3298    
3299     if [[ $(id -u) = 0 ]]
3300     then
3301     retval=0
3302     else
3303     retval=1
3304     fi
3305    
3306     return ${retval}
3307    }
3308    
3309    known_mage_feature()
3310    {
3311     local feature="$1"
3312     local retval
3313    
3314     case "${feature}" in
3315     autosvc|!autosvc) retval=0 ;;
3316     buildlog|!buildlog) retval=0 ;;
3317     ccache|!ccache) retval=0 ;;
3318     check|!check) retval=0 ;;
3319     compressdoc|!compressdoc) retval=0 ;;
3320     debug|!debug) retval=0 ;;
3321     distcc|!distcc) retval=0 ;;
3322     kernelsrcunpack|!kernelsrcunpack) retval=0 ;;
3323     libtool|!libtool) retval=0 ;;
3324     linuxsymlink|!linuxsymlink) retval=0 ;;
3325     pkgbuild|!pkgbuild) retval=0 ;;
3326     pkgdistrotag|!pkgdistrotag) retval=0 ;;
3327     purge|!purge) retval=0 ;;
3328     qalint|!qalint) retval=0 ;;
3329     regentree|!regentree) retval=0 ;;
3330     resume|!resume) retval=0 ;;
3331     srcpkgbuild|!srcpkgbuild) retval=0 ;;
3332     srcpkgtarball|!srcpkgtarball) retval=0 ;;
3333     static|!static) retval=0 ;;
3334     stepbystep|!stepbystep) retval=0 ;;
3335     strip|!strip) retval=0 ;;
3336     verbose|!verbose) retval=0 ;;
3337     *) retval=1 ;;
3338     esac
3339    
3340     return "${retval}"
3341    }
3342    
3343    load_mage_features()
3344    {
3345     for i in ${MAGE_FEATURES_GLOBAL[*]} ${MAGE_FEATURES[*]}
3346     do
3347     FVERBOSE=off msetfeature ${i}
3348     done
3349    }
3350    
3351    msetfeature()
3352    {
3353     local feature
3354     local count
3355     local i
3356     local found
3357    
3358     for feature in $@
3359     do
3360     found=0
3361     count="${#MAGE_FEATURES_CURRENT[*]}"
3362    
3363     if ! known_mage_feature "${feature}"
3364     then
3365     [[ ${FVERBOSE} = off ]] || echo -e "${COLRED}Unknown feature '${feature}', ignoring it${COLDEFAULT}"
3366     return 3
3367     fi
3368    
3369     for ((i=0; i<count; i++))
3370     do
3371     if [[ ${MAGE_FEATURES_CURRENT[${i}]} = ${feature} ]]
3372     then
3373     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' already enabled${COLDEFAULT}"
3374     MAGE_FEATURES_CURRENT[${i}]="${feature}"
3375     found=1
3376     elif [[ ${MAGE_FEATURES_CURRENT[${i}]} = !${feature} ]]
3377     then
3378     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' currently disabled, enabling it!${COLDEFAULT}"
3379     MAGE_FEATURES_CURRENT[${i}]="${feature}"
3380     found=1
3381     elif [[ ${MAGE_FEATURES_CURRENT[${i}]} = ${feature//!} ]]
3382     then
3383     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature//!}' currently enabled, disabling it!${COLDEFAULT}"
3384     MAGE_FEATURES_CURRENT[${i}]="${feature}"
3385     found=1
3386     fi
3387     done
3388    
3389     # if the feature was not found after proccessing the whole array
3390     # it was not declared. in this case enable it
3391     if [[ ${found} = 0 ]]
3392     then
3393     [[ ${FVERBOSE} = off ]] || echo -e "${COLBLUE}---${COLGREEN} Feature '${feature}' was not declared, enabling it!${COLDEFAULT}"
3394     MAGE_FEATURES_CURRENT=( ${MAGE_FEATURES_CURRENT[*]} "${feature}" )
3395     fi
3396    
3397     export MAGE_FEATURE_CURRENT
3398     done
3399    }
3400    
3401    mqueryfeature()
3402    {
3403     local feature="$1"
3404     local retval=1
3405     local i
3406    
3407     if known_mage_feature "${feature}"
3408     then
3409     for i in ${MAGE_FEATURES_CURRENT[*]}
3410     do
3411     if [[ ${i} = ${feature} ]]
3412     then
3413     retval=0
3414     break # found break here
3415     fi
3416     done
3417     else
3418     [[ ${FVERBOSE} = off ]] || echo -e "${COLRED}Unknown feature '${feature}', ignoring it${COLDEFAULT}"
3419     retval=3
3420     fi
3421    
3422     return ${retval}
3423    }
3424    
3425    mprintfeatures()
3426    {
3427     echo "Global features:  ${MAGE_FEATURES_GLOBAL[*]}"
3428     echo "Local features:   ${MAGE_FEATURES[*]}"
3429     echo "Current features: ${MAGE_FEATURES_CURRENT[*]}"
3430    }

Legend:
Removed from v.329  
changed lines
  Added in v.1690