Magellan Linux

Annotation of /branches/mage-0_3_7-r6/mage/usr/lib/mage/mage3.functions.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 24 - (hide annotations) (download) (as text)
Wed Jan 5 05:08:01 2005 UTC (19 years, 4 months ago) by niro
Original Path: trunk/mage/usr/lib/mage/mage3.functions.sh
File MIME type: application/x-sh
File size: 28964 byte(s)
mage-0.3.6-r8 import

1 niro 24 #!/bin/bash
2     # Magellan Linux Installer Functions (mage.functions.sh)
3     # version: 0.3.6-r8
4    
5     mage_setup() {
6     install -d $INSTALLDB
7     }
8    
9     fatal_error() {
10     #$1 is the missing file
11     echo -e "\nFatal Error: Package seemed to be corrupt."
12     echo -e "$1 was not found in ${PKGNAME}"
13     exit 1
14     }
15    
16     build_unpackpkg() {
17     tar xjmf ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} -C ${BUILDDIR}
18     }
19    
20     update_mtime() {
21     local M_MTIME
22     DB_ENTRY=${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
23    
24     #forcing mtime to same value
25     echo
26     echo -n ">>>> Forcing mtime to the same value ..."
27     #find ${BUILDDIR}/${PKGNAME}/binfiles \
28     # -exec touch -m -r ${BUILDDIR}/${PKGNAME}/.mtime '{}' ';' \
29     # && echo done || echo false
30    
31    
32     #get new M_MTIME from .mtime
33     M_MTIME=$(stat -c %Y ${DB_ENTRY}/.mtime)
34    
35     #updating .files db entries; only if not empty, or they get killed
36     if [ -e "${DB_ENTRY}/.files" ]
37     then
38     if [ -n "$(cat ${DB_ENTRY}/.files)" ]
39     then
40     #make backup
41     mv ${DB_ENTRY}/.files \
42     ${DB_ENTRY}/.files-old
43    
44     #sets fieldseperator to "§" instead of " "
45     IFS=§
46    
47     #update
48     while read pathto posix user group mtime md5sum
49     do
50     echo "${pathto}§${posix}§${user}§${group}§${M_MTIME}§${md5sum}" \
51     >> ${DB_ENTRY}/.files
52     touch -m -r ${DB_ENTRY}/.mtime ${pathto}
53     done < ${DB_ENTRY}/.files-old
54    
55     #remove old list
56     rm -f ${DB_ENTRY}/.files-old
57    
58     #very important: unsetting the '§' fieldseperator
59     unset IFS
60     fi
61     else
62     fatal_error .files
63     fi
64    
65    
66     #updating .symlink db entries; only if not empty, or they get killed
67     if [ -e "${DB_ENTRY}/.symlinks" ]
68     then
69     if [ -n "$(cat ${DB_ENTRY}/.symlinks)" ]
70     then
71     #make backup
72     mv ${DB_ENTRY}/.symlinks \
73     ${DB_ENTRY}/.symlinks-old
74    
75     #sets fieldseperator to "§" instead of " "
76     IFS=§
77    
78     #update
79     while read pathto posix link mtime
80     do
81     echo "${pathto}§${posix}§${link}§${M_MTIME}" \
82     >> ${DB_ENTRY}/.symlinks
83     touch -m -r ${DB_ENTRY}/.mtime ${pathto}
84     done < ${DB_ENTRY}/.symlinks-old
85    
86     #remove old list
87     rm -f ${DB_ENTRY}/.symlinks-old
88    
89     #very important: unsetting the '§' fieldseperator
90     unset IFS
91     fi
92     else
93     fatal_error .symlinks
94     fi
95     }
96    
97     ###################################################
98     # function install_direcories #
99     # install_direcories $PKGNAME #
100     ###################################################
101     install_directories() {
102     local PKGNAME
103     PKGNAME=$1
104    
105     if [ -e ${BUILDDIR}/${PKGNAME}/.dirs ]
106     then
107    
108     #sets fieldseperator to "§" instead of " "
109     IFS=§
110    
111     while read pathto posix user group
112     do
113     if [ ! -z $pathto ]
114     then
115     if [ "$VERBOSE" == "on" ]
116     then
117     echo -e "\t>>> DIR: $pathto"
118     fi
119     install -m $posix -o $user -g $group -d "$pathto"
120     fi
121     done < ${BUILDDIR}/${PKGNAME}/.dirs
122    
123     #very important: unsetting the '§' fieldseperator
124     unset IFS
125     else
126     fatal_error .dir
127     fi
128     }
129    
130    
131     ###################################################
132     # function install_files #
133     # install_files $PKGNAME #
134     ###################################################
135     install_files(){
136     local PKGNAME
137     local RETVAL
138     local COUNTER
139     local FILENAME
140     local DESTINATION
141    
142     PKGNAME=$1
143    
144     if [ -e ${BUILDDIR}/${PKGNAME}/.files ]
145     then
146     #sets fieldseperator to "§" instead of " "
147     IFS=§
148    
149     while read pathto posix user group mtime md5sum
150     do
151     if [ ! -z $pathto ]
152     then
153     if [ "$VERBOSE" == "on" ]
154     then
155     echo -e "\t>>> FILE: $pathto"
156     fi
157     ### kleiner notfall fix ###
158     if [ ! -d `dirname $pathto` ]
159     then
160     install -d `dirname $pathto`
161     fi
162    
163     #when file exists, check if protected
164     if [ -e ${pathto} ]
165     then
166     is_config_protected "${pathto}"
167     RETVAL=$?
168    
169     # 0 - not protected #
170     # 1 - error #
171     # 2 - protected #
172     # 3 - protected but masked #
173    
174     case ${RETVAL} in
175     #file is not protected - overwrite it
176     0|3)
177     FILE="$pathto"
178     install -m ${posix} -o ${user} -g ${group} \
179     ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \
180     "$pathto"
181     ;;
182    
183     #file is protected - write backup file
184     # "._cfg${COUNTER}_{FILENAME}
185     2)
186     #moves the cursor up
187     echo -en \\033[A
188     echo -e "${COLRED}! prot ${COLDEFAULT} === FILE: $pathto"
189     FILENAME=$(basename "${pathto}")
190     FILE="$pathto"
191     COUNTER=$(count_protected_files ${FILE})
192     DESTINATION="$(dirname "$pathto")/._cfg${COUNTER}_${FILENAME}"
193     install -m ${posix} -o ${user} -g ${group} \
194     ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \
195     "${DESTINATION}"
196    
197     #set run_etc_update=true
198     PROTECT_COUNT=${PROTECT_COUNT}+1
199     ;;
200     esac
201     else
202     #install file because it does not exists
203     FILE="$pathto"
204     install -m ${posix} -o ${user} -g ${group} \
205     ${BUILDDIR}/${PKGNAME}/binfiles/$FILE \
206     "$pathto"
207     fi
208    
209     #not needed anymore ?
210     #if [ ! -z $user ]
211     #then
212     # chown $user:$group $FILE ### <---- test
213     #fi
214     fi
215     done < ${BUILDDIR}/${PKGNAME}/.files
216    
217     #very important: unsetting the '§' fieldseperator
218     unset IFS
219     else
220     fatal_error .files
221     fi
222     }
223    
224    
225     ###################################################
226     # function install_symlinks #
227     # install_symlinks $PKGNAME #
228     ###################################################
229     install_symlinks() {
230     local PKGNAME
231     PKGNAME=$1
232    
233     if [ -e ${BUILDDIR}/${PKGNAME}/.symlinks ]
234     then
235     #sets fieldseperator to "§" instead of " "
236     IFS=§
237    
238     while read pathto posix link mtime
239     do
240     if [ ! -z $pathto ]
241     then
242     if [ "$VERBOSE" == "on" ]
243     then
244     echo -e "\t>>> LINK: $pathto"
245     fi
246     ln -snf $link "$pathto"
247     fi
248     done < ${BUILDDIR}/${PKGNAME}/.symlinks
249    
250     #very important: unsetting the '§' fieldseperator
251     unset IFS
252     else
253     fatal_error .symlinks
254     fi
255     }
256    
257    
258     ###################################################
259     # function install_blockdevices #
260     # install_blockdevices $PKGNAME #
261     ###################################################
262     install_blockdevices() {
263     local PKGNAME
264     PKGNAME=$1
265    
266     if [ -e ${BUILDDIR}/${PKGNAME}/.pipes ]
267     then
268     #sets fieldseperator to "§" instead of " "
269     IFS=§
270    
271     while read pathto posix
272     do
273     if [ ! -z $pathto ]
274     then
275     if [ "$VERBOSE" == "on" ]
276     then
277     echo -e "\t>>> PIPE: $pathto"
278     fi
279     mkfifo -m $posix "$pathto"
280     fi
281     done < ${BUILDDIR}/${PKGNAME}/.pipes
282    
283     #very important: unsetting the '§' fieldseperator
284     unset IFS
285     else
286     fatal_error .pipes
287     fi
288     }
289    
290    
291     ###################################################
292     # function install_characterdevices #
293     # install_characterdevices $PKGNAME #
294     ###################################################
295     install_characterdevices() {
296     local PKGNAME
297     PKGNAME=$1
298    
299     if [ -e ${BUILDDIR}/${PKGNAME}/.char ]
300     then
301     #sets fieldseperator to "§" instead of " "
302     IFS=§
303    
304     while read pathto posix
305     do
306     if [ ! -z $pathto ]
307     then
308     if [ "$VERBOSE" == "on" ]
309     then
310     echo -e "\t>>> CHAR: $pathto"
311     fi
312     mknode -m $posix -c "$pathto"
313     fi
314     done < ${BUILDDIR}/${PKGNAME}/.char
315    
316     #very important: unsetting the '§' fieldseperator
317     unset IFS
318     else
319     fatal_error .char
320     fi
321    
322     #very important: unsetting the '§' fieldseperator
323     unset IFS
324     }
325    
326    
327     ###################################################
328     # function build_doinstall #
329     # build_doinstall $PKGNAME #
330     # NOTE: this is an wrapper do install packages #
331     ###################################################
332     build_doinstall() {
333     #this is only a wrapper
334    
335     # NOTE:
336     # !! we use § as field seperator !!
337     # doing so prevent us to get errors by filenames with spaces
338    
339     local PKGNAME
340     PKGNAME=$1
341    
342     install_directories ${PKGNAME}
343     install_files ${PKGNAME}
344     install_symlinks ${PKGNAME}
345     install_blockdevices ${PKGNAME}
346     install_characterdevices ${PKGNAME}
347     }
348    
349    
350     ###################################################
351     # function install_database_entry #
352     # install_database_entry $PKGNAME $PKGTYPE #
353     # PKGTYPE can be "virtual", "sources" or nothing #
354     ###################################################
355     install_database_entry(){
356     local PKGNAME
357     local PKGTYPE
358    
359     PKGNAME=$1
360     PKGTYPE=$2
361    
362     #add package to database
363     install -d ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
364    
365     #install mage-file to database
366     install -m 0644 -o root -g root \
367     ${MAGEFILE} \
368     ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
369    
370     # create fake file descriptors
371     # used by virtual and source packages
372     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.dirs
373     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.symlinks
374     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.files
375     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.pipes
376     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.char
377     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.mtime
378    
379     #put category to database
380     echo ${CATEGORIE} > ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.categorie
381    
382     #install PKGTYPE specific files
383     case ${PKGTYPE} in
384     virtual)
385     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.virtual
386     ;;
387    
388     sources)
389     touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.sources
390     ;;
391    
392     *)
393     # normal packages needs these files
394     cp -f ${BUILDDIR}/${PKGNAME}/.{char,dirs,files,pipes,symlinks,mtime} \
395     ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
396     ;;
397     esac
398     }
399    
400    
401     ###################################################
402     # function remove_database_entry #
403     # remove_database_entry $PKGNAME $PKGTYPE #
404     # PKGTYPE can be "virtual", "sources" or nothing #
405     ###################################################
406     remove_database_entry(){
407     local PKGNAME
408     local PKGTYPE
409    
410     PKGNAME=$1
411     PKGTYPE=$2
412    
413     #removes database entry
414     if [ -d ${INSTALLDB}/${PKGNAME} ]
415     then
416     rm -rf ${INSTALLDB}/${PKGNAME}
417     fi
418     }
419    
420    
421     ###################################################
422     # function compare_mtime #
423     # compare_mtime $PKGNAME /path/to/file #
424     # #
425     # returns: #
426     # 0=delete me #
427     # 1=keep me #
428     # #
429     # compares mtime of given files in packages #
430     ###################################################
431     compare_mtime(){
432     local DBDIR
433     local pathto
434     local x
435    
436     DBDIR=$1
437     pathto=$2
438    
439     M_MTIME=$(stat -c %Y ${INSTALLDB}/${DBDIR}/.mtime)
440    
441     #if $pathto is a symlink than compare linked binary
442     if [ -L ${pathto} ]
443     then
444     #readlink -f resolves full path of linked file
445     x=$(stat -c %Y $(readlink -f ${pathto}))
446     else
447     x=$(stat -c %Y ${pathto})
448     fi
449    
450     if [ "${M_MTIME}" -eq "${x}" ]
451     then
452     #echo "delete me: ${pathto}"
453     return 0
454     else
455     #echo "keep me : ${pathto}"
456     return 1
457     fi
458     }
459    
460    
461     ###################################################
462     # function remove_symlinks #
463     # remove_symlinks $PKGNAME #
464     ###################################################
465     remove_symlinks() {
466     local PKGNAME
467     local RETVAL
468    
469     PKGNAME=$1
470    
471     if [ -e ${INSTALLDB}/${PKGNAME}/.symlinks ]
472     then
473     #sets fieldseperator to "§" instead of " "
474     IFS=§
475    
476     while read pathto posix link mtime
477     do
478     if [ ! -z $pathto ]
479     then
480     if [ -L $pathto ]
481     then
482     compare_mtime ${PKGNAME} ${pathto}
483     RETVAL=$?
484     # 0=delete me #
485     # 1=keep me #
486     case ${RETVAL} in
487     0)
488     echo -e "\t<<< LINK: $pathto"
489     rm $pathto
490     ;;
491     1)
492     echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: $pathto"
493     ;;
494     esac
495     else
496     echo -e "${COLRED}! exist${COLDEFAULT} === LINK: $pathto"
497     fi
498     fi
499     done < ${INSTALLDB}/${PKGNAME}/.symlinks
500    
501     #very important: unsetting the '§' fieldseperator
502     unset IFS
503     else
504     fatal_error .symlinks
505     fi
506     }
507    
508    
509     ###################################################
510     # function remove_files #
511     # remove_files $PKGNAME #
512     ###################################################
513     remove_files() {
514     local PKGNAME
515     local RETVAL
516    
517     PKGNAME=$1
518    
519     #uninstall of files
520     if [ -e ${INSTALLDB}/${PKGNAME}/.files ]
521     then
522     #sets fieldseperator to "§" instead of " "
523     IFS=§
524    
525     while read pathto posix user group mtime md5sum
526     do
527     if [ ! -z $pathto ]
528     then
529     if [ -e $pathto ]
530     then
531     compare_mtime ${PKGNAME} ${pathto}
532     RETVAL=$?
533     # 0=delete me #
534     # 1=keep me #
535     case ${RETVAL} in
536     0)
537     echo -e "\t<<< FILE: $pathto"
538     rm $pathto
539     ;;
540     1)
541     echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: $pathto"
542     ;;
543     esac
544     else
545     echo -e "${COLRED}! exist${COLDEFAULT} === FILE: $pathto"
546     fi
547     fi
548     done < ${INSTALLDB}/${PKGNAME}/.files
549    
550     #very important: unsetting the '§' fieldseperator
551     unset IFS
552     else
553     fatal_error .files
554     fi
555     }
556    
557    
558     ###################################################
559     # function remove_blockdevices #
560     # remove_blockdevices $PKGNAME #
561     ###################################################
562     remove_blockdevices() {
563     local PKGNAME
564     PKGNAME=$1
565    
566     if [ -e ${INSTALLDB}/${PKGNAME}/.pipes ]
567     then
568     #sets fieldseperator to "§" instead of " "
569     IFS=§
570    
571     while read pathto posix
572     do
573     if [ ! -z $pathto ]
574     then
575     echo -e "\t<<< PIPE: $pathto"
576     rm $pathto
577     fi
578     done < ${INSTALLDB}/${PKGNAME}/.pipes
579    
580     #very important: unsetting the '§' fieldseperator
581     unset IFS
582     else
583     fatal_error .pipes
584     fi
585     }
586    
587    
588     ###################################################
589     # function remove_characterdevices #
590     # remove_characterdevices $PKGNAME #
591     ###################################################
592     remove_characterdevices() {
593     local PKGNAME
594     PKGNAME=$1
595    
596     if [ -e ${INSTALLDB}/${PKGNAME}/.char ]
597     then
598     #sets fieldseperator to "§" instead of " "
599     IFS=§
600    
601     while read pathto posix
602     do
603     if [ ! -z $pathto ]
604     then
605     echo -e "\t<<< CHAR: $pathto"
606     rm $pathto
607     fi
608     done < ${INSTALLDB}/${PKGNAME}/.char
609    
610     #very important: unsetting the '§' fieldseperator
611     unset IFS
612     else
613     fatal_error .char
614     fi
615     }
616    
617    
618     ###################################################
619     # function remove_direcories #
620     # remove_direcories $PKGNAME #
621     ###################################################
622     remove_directories() {
623     local PKGNAME
624     PKGNAME=$1
625    
626     #uninstall of dirs ## added small hack to fix dirs
627     # must be reverse -> smage2 doesn't sort them
628     if [ -e ${INSTALLDB}/${PKGNAME}/.dirs ]
629     then
630    
631     #sort directory order
632     mv ${INSTALLDB}/${PKGNAME}/.dirs ${INSTALLDB}/${PKGNAME}/.dirs_old
633     cat ${INSTALLDB}/${PKGNAME}/.dirs_old | sort > ${INSTALLDB}/${PKGNAME}/.dirs
634    
635     #sets fieldseperator to "§" instead of " "
636     IFS=§
637    
638     while read pathto posix
639     do
640     if [ ! -z $pathto ]
641     then
642     if [ -e $pathto ]
643     then
644     echo -e "\t<<< DIR: $pathto"
645     rmdir $pathto &> /dev/null
646     if [ "$?" -ne "0" ]
647     then
648     #moves the cursor up
649     echo -en \\033[A
650     echo -e "${COLRED}! empty${COLDEFAULT} === DIR: $pathto"
651     fi
652     else
653     echo -e "${COLRED}! exist${COLDEFAULT} === DIR: $pathto"
654     fi
655     fi
656     done < ${INSTALLDB}/${PKGNAME}/.dirs
657    
658     #very important: unsetting the '§' fieldseperator
659     unset IFS
660     else
661     fatal_error .dirs
662     fi
663     }
664    
665    
666     ###################################################
667     # function build_douninstall #
668     # build_douninstall $PKGNAME #
669     # NOTE: this is an wrapper do remove packages #
670     ###################################################
671     build_douninstall() {
672     #this is only a wrapper
673    
674     # NOTE:
675     # !! we use § as field seperator !!
676     # doing so prevent us to get errors by filenames with spaces
677    
678     local PKGNAME
679     PKGNAME=$1
680    
681     remove_symlinks ${PKGNAME}
682     remove_files ${PKGNAME}
683     remove_blockdevices ${PKGNAME}
684     remove_characterdevices ${PKGNAME}
685     remove_directories ${PKGNAME}
686     }
687    
688     getpackages() {
689     if [ -z "$MIRRORS" ]
690     then
691     echo "You have no mirrors defined. Please edit your /etc/mage.rc."
692     exit 1
693     fi
694    
695     local i
696     for i in $MIRRORS
697     do
698     wget \
699     --passive-ftp \
700     --tries 3 \
701     --continue \
702     --progress bar \
703     --directory-prefix=${PKGDIR} \
704     ${i}/packages/${PKGNAME}.${PKGSUFFIX}
705     if [ "$?" == "0" ]
706     then
707     break
708     else
709     continue
710     fi
711     done
712     }
713    
714     syncmage() {
715     if [ -z "$RSYNC" ]
716     then
717     echo "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."
718     exit 1
719     fi
720    
721     local i
722     for i in $RSYNC
723     do
724     rsync \
725     --recursive \
726     --links \
727     --perms \
728     --times \
729     --devices \
730     --timeout=600 \
731     --verbose \
732     --compress \
733     --progress \
734     --stats \
735     --delete \
736     --delete-after \
737     $i $MAGEDIR
738     if [ "$?" == "0" ]
739     then
740     break
741     else
742     continue
743     fi
744     done
745    
746     #clean up backup files (foo~)
747     find ${MAGEDIR} -name *~ -exec rm '{}' ';'
748     }
749    
750     cleanpkg(){
751     if [ -d "$PKGDIR" ]
752     then
753     echo -n "Removing downloaded packages... "
754     rm -rf ${PKGDIR}/*
755     echo "done."
756     fi
757     }
758    
759     ###################################################
760     # function keepfiles #
761     # keepfiles "$CATEGORIE/$PNAME" "$filename" #
762     # note wildchars allowed #
763     ###################################################
764     keepfiles() {
765     local name
766     local keep
767     name="`echo $1| cut -d '/' -f2`"
768     keep="$2"
769    
770     DELPKG="`find ${INSTALLDB} -name ${name}*.mage`"
771     DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)"
772     cp ${DELDIR}/.files ${DELDIR}/.files-orig
773     sed "s:${keep}::" \
774     ${DELDIR}/.files-orig > ${DELDIR}/.files
775     rm ${DELDIR}/.files-orig
776     }
777    
778    
779     ###################################################
780     # function injectpkg #
781     # injectpkg "$CATEGORIE/$PNAME" #
782     # note wildchars allowed #
783     ###################################################
784     injectpkg() {
785     local name
786     local categorie
787     local magename
788     name="`echo $1| cut -d '/' -f2`"
789     categorie="`echo $1| cut -d '/' -f1`"
790    
791     INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`"
792     for i in ${INJPKG}
793     do
794     magename="$(basename ${INJPKG} .mage)"
795     echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}"
796     install -d ${INSTALLDB}/${magename}
797     touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char}
798    
799     #installs magefile
800     install -m 0644 -o root -g root \
801     ${MAGEDIR}/${categorie}/${magename}.mage \
802     ${INSTALLDB}/${magename}
803     done
804     }
805    
806     ###################################################
807     # function reminjected #
808     # reminjected #
809     # note: removes all injected packages #
810     ###################################################
811     reminjected() {
812     DELINJ="`find ${INSTALLDB} -name .injected`"
813     for i in ${DELINJ}
814     do
815     magename=$(dirname ${i})
816     if [ -d "${magename}" ]
817     then
818     # small fix to protect the mage-db deleting itself, that is not so funny :)
819     if [ "${magename}" != "${INSTALLDB}" ]
820     then
821     echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}"
822     rm -rf ${magename}
823     fi
824     fi
825     done
826     }
827    
828    
829     xtitle() {
830     if [ ${TERM} == "xterm" ]
831     then
832     echo -ne "\033]0;Mage: $1\007"
833     fi
834     return 0
835     }
836    
837    
838     xtitleclean() {
839     if [ ${TERM} == "xterm" ]
840     then
841     echo -ne "\033]0;\007"
842     fi
843     return 0
844     }
845    
846    
847     spin_processbar() {
848    
849     # does not works as it should -- disabled
850     # you musst add and remove a tempfile outside this funktion
851     # to leave this funktion ...
852    
853     # before you call this function do this:
854     #
855     # touch /var/tmp/proz
856     # build_doinstall|spin_processbar
857    
858     echo -en "Processing: "
859     while [ -f /var/tmp/proz ]
860     do
861     echo -en "-\b"
862     sleep 0.01
863     echo -en "\\ \b\b"
864     sleep 0.01
865     echo -en "|\b"
866     sleep 0.01
867     echo -en "/\b"
868     sleep 0.01
869     done
870     echo "done"
871     return 0
872    
873     # when you want to leave the funktion do
874     # something like this:
875     #
876     # #remove spinner tempfile
877     # if [ "$VERBOSE" == "off" ]
878     # then
879     # if [ -f /var/tmp/proz ]
880     # then
881     # rm /var/tmp/proz
882     # fi
883     # fi
884    
885     }
886    
887    
888     #cuts full pathnames or versioniezed names down to basename
889     choppkgname(){
890     #we want this only if full name was used
891     if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
892     then
893     #cuts ARCH and PBUILD
894     #ARCH comes from /etc/mage.rc
895     MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
896    
897     #cuts version number
898     MAGENAME=$(basename ${MAGENAME%-*} .mage)
899     fi
900     }
901    
902    
903     # get_categorie $PKGNAME, returns CATEGORIE
904     # ret 0=ok, 1=not_found
905     getcategorie(){
906     for CAT in ${MAGEDIR}/*
907     do
908     if [ -d ${CAT}/${MAGENAME} ]
909     then
910     #debug only
911     if [ "$MAGEDEBUG" == "on" ]
912     then
913     echo "$MAGENAME found -> $CAT/$MAGENAME"
914     echo "categorie = $(basename ${CAT})"
915     fi
916     CATEGORIE=$(basename ${CAT})
917     fi
918     done
919    
920     #package does not exists
921     if [ -z "$CATEGORIE" ]
922     then
923     echo -e "Package "${COLRED}"\"${MAGENAME}\""${COLDEFAULT}" does not exists."
924     exit 1
925     fi
926     }
927    
928    
929     #check_stable_package /path/to/foo.mage
930     # returns 0=stable 1=unstable
931     check_stable_package(){
932     #be sure no previous $STATES exists
933     unset STATE
934    
935     source $1
936    
937     #if USE_UNSTABLE=true this must be prevented
938     if [ "${USE_UNSTABLE}" != "true" ]
939     then
940     if [ "${STATE}" != "stable" ]
941     then
942     return 1
943     else
944     if [ "${STATE}" == "old" ]
945     then
946     return 1
947     fi
948     fi
949     fi
950    
951     #unset the sourced varibales;
952     #we'll got bad problems later on if we don't do this
953     unset PKGNAME
954     unset STATE
955     unset DESCRIPTION
956     unset HOMEPAGE
957     unset DEPEND
958     unset SDEPEND
959     unset PROVIDE
960     unset PKGTYPE
961     unset preinstall
962     unset postinstall
963    
964     return 0
965     }
966    
967    
968     #get_highest_magefile ${CATEGORIE} ${PKGNAME}
969     #fake at moment returns only stable pkgs (must set to be one)
970     # return $HIGHEST_MAGEFILE
971     get_highest_magefile(){
972     unset HIGHEST_MAGEFILE
973     #CATEGORIE=$1
974     #PKGNAME=$2
975    
976     for i in ${MAGEDIR}/${CATEGORIE}/${MAGENAME}/*
977     do
978     #we exclude subdirs (for stuff like a md5sum dir)
979     if [ ! -d ${i} ]
980     then
981     check_stable_package ${i}
982     if [ "$?" == "0" ]
983     then
984     HIGHEST_MAGEFILE=${i}
985     #for debug only
986     if [ "$MAGEDEBUG" == "on" ]
987     then
988     echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
989     fi
990     fi
991     fi
992     done
993    
994     MAGEFILE=${HIGHEST_MAGEFILE}
995     return 0
996     }
997    
998    
999     ###################################################
1000     # function is_config_protected #
1001     # is_config_protected /path/to/file #
1002     # #
1003     # returns: #
1004     # 0 - not protected #
1005     # 1 - error #
1006     # 2 - protected #
1007     # 3 - protected but masked #
1008     # #
1009     ###################################################
1010     is_config_protected() {
1011     local EXPFILE
1012     local TEST
1013     local PROTECTED
1014     local IFS
1015    
1016     EXPFILE=$1
1017    
1018     #to be safe; it may be '§'
1019     IFS=' '
1020    
1021     #check ob in config protect
1022     for i in ${CONFIG_PROTECT}
1023     do
1024     #ersetzen von $i nur wenn am anfang der variable
1025     TEST="${EXPFILE/#${i}/Protected}"
1026     if [ ${TEST} != ${EXPFILE} ]
1027     then
1028     #setzen das es protected ist
1029     PROTECTED=TRUE
1030    
1031     #check ob nicht doch maskiert
1032     for x in ${CONFIG_PROTECT_MASK}
1033     do
1034     TEST="${EXPFILE/#${x}/Protect_Masked}"
1035     if [ ${TEST} != ${EXPFILE} ]
1036     then
1037     PROTECTED=MASKED
1038     fi
1039     done
1040     fi
1041     done
1042    
1043     unset IFS
1044    
1045     case ${PROTECTED} in
1046     TRUE)
1047     #echo "I'm protected"
1048     return 2
1049     ;;
1050     MASKED)
1051     #echo "I'm protected, but masked - delete me"
1052     return 3
1053     ;;
1054     *)
1055     #echo "delete me"
1056     return 0
1057     ;;
1058     esac
1059     }
1060    
1061    
1062     ###################################################
1063     # function count_protected_files #
1064     # count_protected_files /path/to/file #
1065     # #
1066     # note: prints number of protected files #
1067     # exp: 0012 #
1068     ###################################################
1069     count_protected_files() {
1070     ${MLIBDIR}/writeprotected $1
1071     }
1072    
1073    
1074     #call with 'get_magefile_to_uninstall SEARCHSTRING'
1075     #returns /path/to/magefile
1076     get_magefile_to_uninstall() {
1077     local RESULT
1078     local SSTRING
1079     local i
1080     local x
1081     local z
1082    
1083     SSTRING=$1
1084    
1085     for i in ${INSTALLDB}/*/*
1086     do
1087     #echo ${i}
1088     #to be sure
1089     if [ -d ${i} ]
1090     then
1091     #echo "DEBUG: stripped i: $(basename ${i%-*-*})"
1092     if [ $(basename ${i%-*-*}) == ${SSTRING} ]
1093     then
1094     #RESULT="${RESULT} ${i}"
1095     CATEGORIE=$(< ${i}/.categorie)
1096     #echo ${CATEGORIE}/$(basename ${RESULT})
1097     RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})"
1098     fi
1099     fi
1100     done
1101    
1102     if [ -n "${RESULT}" ]
1103     then
1104     #check if ONE package was found and not more
1105     declare -i x=0
1106     for i in ${RESULT}
1107     do
1108     x=${x}+1
1109     done
1110     if [ ${x} -eq 1 ]
1111     then
1112     #echo "jo ich uninstall $(basename ${RESULT}) ..."
1113     #the mage file
1114     #echo "${RESULT}/$(basename ${RESULT}).mage"
1115    
1116     #gets categorie of the package
1117     #CATEGORIE=$(< ${i}/.categorie)
1118     #echo ${CATEGORIE}/$(basename ${RESULT})
1119     echo "${RESULT}"
1120     return 0
1121     else
1122     #echo "More than one package found ..."
1123     echo "${RESULT}"
1124     return 2
1125     fi
1126     else
1127     #echo "No package found named '${SSTRING}'."
1128     echo "${SSTRING}"
1129     return 1
1130     fi
1131     }
1132    
1133    
1134     # reads virtualdb file
1135     #$1 = virtualname; $2 commands: showpkgs, showline
1136     #return 0 == installed -> shows installed pkg as well
1137     #return 1 == not installed
1138     virtuals_read() {
1139     local VIRTUAL_NAME COMMAND VIRT_LINE line x i
1140    
1141     VIRTUAL_NAME=$1
1142     COMMAND=$2
1143    
1144     # parse file to get virtual_name line
1145     IFS=$'\n'
1146     for line in $(< ${VIRTUALDB_FILE})
1147     do
1148     IFS=$' '
1149     for x in ${line}
1150     do
1151     if [ "${x}" == "${VIRTUAL_NAME}" ]
1152     then
1153     VIRT_LINE="${line}"
1154    
1155     if [ "${COMMAND}" == "showline" ]
1156     then
1157     #give out the non stripped line
1158     echo "${line}"
1159     fi
1160     fi
1161     done
1162    
1163     IFS=$'\n'
1164     done
1165    
1166     unset IFS
1167    
1168     #now read the packages linked to VIRTUAL_NAME and output them
1169     if [ -n "${VIRT_LINE}" ]
1170     then
1171     if [ "${COMMAND}" == "showpkgs" ]
1172     then
1173     declare -i x=0
1174     for i in ${VIRT_LINE}
1175     do
1176     if [ ${x} -ge 1 ]
1177     then
1178     echo "${i}"
1179     fi
1180     ((x++))
1181     done
1182     fi
1183     return 0
1184     fi
1185     return 1
1186     }
1187    
1188    
1189     #add pkg to virtualdb
1190     # $1 == virtualname $2= pkgname
1191     # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1192     virtuals_add(){
1193     local VIRTUAL_NAME PKG_NAME OLD_LINE line i
1194    
1195     VIRTUAL_NAME=$1
1196     PKG_NAME=$2
1197    
1198    
1199     if virtuals_read ${VIRTUAL_NAME}
1200     then
1201     #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1202     for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1203     do
1204     if [ "${i}" == ${PKG_NAME} ]
1205     then
1206     echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..."
1207     return 3
1208     fi
1209     done
1210    
1211     echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..."
1212     OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1213    
1214     #make a backup
1215     mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1216    
1217     IFS=$'\n'
1218     for line in $(< ${VIRTUALDB_FILE}.old)
1219     do
1220     #if the right line, append ${PKG_NAME}, else do nothing
1221     if [ "${line}" == "${OLD_LINE}" ]
1222     then
1223     echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE}
1224     else
1225     echo "${line}" >> ${VIRTUALDB_FILE}
1226     fi
1227     done
1228    
1229     unset IFS
1230     else
1231     echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..."
1232     echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \
1233     && echo "ok" || echo "false"
1234     fi
1235    
1236     return 0
1237     }
1238    
1239     #deletes pakages from virtual database
1240     #$1 virtualname; $2 pkgname
1241     virtuals_del() {
1242    
1243     local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED
1244    
1245     VIRTUAL_NAME=$1
1246     PKG_NAME=$2
1247    
1248     #first check if exists
1249     if virtuals_read ${VIRTUAL_NAME}
1250     then
1251     #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1252     declare -i x=0
1253     for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1254     do
1255     if [ "${i}" == "${PKG_NAME}" ]
1256     then
1257     PKG_INSTALLED=true
1258     fi
1259     ((x++))
1260     done
1261    
1262     #abort if not installed
1263     if [ "${PKG_INSTALLED}" != "true" ]
1264     then
1265     echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."
1266     return 0
1267     fi
1268    
1269     if [ ${x} -ge 2 ]
1270     then
1271     METHOD=update
1272     else
1273     METHOD=delall
1274     fi
1275    
1276     #get the complete line
1277     OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1278    
1279     #make a backup
1280     mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1281    
1282     #parse virtualdb
1283     IFS=$'\n'
1284     for line in $(< ${VIRTUALDB_FILE}.old)
1285     do
1286     if [ "${line}" == "${OLD_LINE}" ]
1287     then
1288     #delall or update?
1289     case ${METHOD} in
1290     update)
1291     echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."
1292     #del PKG_NAME from line
1293     echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}
1294     ;;
1295     delall)
1296     echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."
1297     #continue; do not write anything
1298     continue
1299     ;;
1300     esac
1301     else
1302     echo "${line}" >> ${VIRTUALDB_FILE}
1303     fi
1304     done
1305     unset IFS
1306     else
1307     echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."
1308     fi
1309     }
1310    
1311     # gets real pkgname from virtuals.default
1312     #$1=VIRTUAL_NAME; returns PKG_NAME
1313     default_virtualname_to_pkgname(){
1314     local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1315    
1316     VIRTUAL_NAME=$1
1317    
1318     while read db_virtualname db_pkgname
1319     do
1320     if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1321     then
1322     PKG_NAME="${db_pkgname}"
1323     fi
1324     done << EOF
1325     $(< ${VIRTUALDB_DEFAULTS})
1326     EOF
1327    
1328     if [ -n "${PKG_NAME}" ]
1329     then
1330     echo "${PKG_NAME}"
1331     fi
1332     }

Properties

Name Value
svn:executable *