Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 40 - (hide annotations) (download) (as text)
Thu Jan 6 23:28:28 2005 UTC (19 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 29699 byte(s)
updated revision tags

1 niro 24 #!/bin/bash
2     # Magellan Linux Installer Functions (mage.functions.sh)
3 niro 40 # version: 0.3.6-r10
4 niro 24
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 niro 39 if [ ! -z "$pathto" ]
114 niro 24 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 niro 39 if [ ! -z "${pathto}" ]
152 niro 24 then
153 niro 39 if [ "${VERBOSE}" == "on" ]
154 niro 24 then
155 niro 39 echo -e "\t>>> FILE: ${pathto}"
156 niro 24 fi
157     ### kleiner notfall fix ###
158 niro 39 if [ ! -d "$(dirname "${pathto}")" ]
159 niro 24 then
160 niro 39 install -d "$(dirname "${pathto}")"
161 niro 24 fi
162    
163     #when file exists, check if protected
164 niro 39 if [ -e "${pathto}" ]
165 niro 24 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 niro 39 FILENAME="$(basename "${pathto}")"
190 niro 24 FILE="$pathto"
191 niro 39 COUNTER=$(count_protected_files "${FILE}")
192 niro 24 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 niro 39 if [ ! -z "$pathto" ]
241 niro 24 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 niro 39 if [ ! -z "$pathto" ]
274 niro 24 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 niro 39 if [ ! -z "$pathto" ]
307 niro 24 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 niro 39 x=$(stat -c %Y "$(readlink -f "${pathto}")")
446 niro 24 else
447 niro 39 x=$(stat -c %Y "${pathto}")
448 niro 24 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 niro 39 if [ ! -z "$pathto" ]
479 niro 24 then
480 niro 39 if [ -L "$pathto" ]
481 niro 24 then
482 niro 39 compare_mtime ${PKGNAME} "${pathto}"
483 niro 24 RETVAL=$?
484     # 0=delete me #
485     # 1=keep me #
486     case ${RETVAL} in
487     0)
488     echo -e "\t<<< LINK: $pathto"
489 niro 39 rm "$pathto"
490 niro 24 ;;
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 niro 39 if [ ! -z "$pathto" ]
528 niro 24 then
529 niro 39 if [ -e "$pathto" ]
530 niro 24 then
531 niro 39 compare_mtime ${PKGNAME} "${pathto}"
532 niro 24 RETVAL=$?
533     # 0=delete me #
534     # 1=keep me #
535     case ${RETVAL} in
536     0)
537     echo -e "\t<<< FILE: $pathto"
538 niro 39 rm "$pathto"
539 niro 24 ;;
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 niro 39 if [ ! -z "$pathto" ]
574 niro 24 then
575     echo -e "\t<<< PIPE: $pathto"
576 niro 39 rm "$pathto"
577 niro 24 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 niro 39 if [ ! -z "$pathto" ]
604 niro 24 then
605     echo -e "\t<<< CHAR: $pathto"
606 niro 39 rm "$pathto"
607 niro 24 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 niro 39 if [ ! -z "$pathto" ]
641 niro 24 then
642 niro 39 if [ -e "$pathto" ]
643 niro 24 then
644     echo -e "\t<<< DIR: $pathto"
645 niro 39 rmdir "$pathto" &> /dev/null
646 niro 24 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 niro 31 # stop here if HIGHEST_MAGEFILE is zero
995     # this package must be unstable or old
996     if [ -z "${HIGHEST_MAGEFILE}" ]
997     then
998     echo
999     echo -n "All packages named "
1000     echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1001     echo -n " are marked "
1002     echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1003     echo "."
1004     echo "You need to declare USE_UNSTABLE=true to install this."
1005     echo
1006     echo "Example:"
1007     echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1008     echo
1009     echo "Be warned that these packages are not stable and may cause serious problems."
1010     echo "You should know what you are doing, so don't complain about any damage."
1011     echo
1012 niro 36 return 1
1013 niro 31 fi
1014    
1015 niro 24 MAGEFILE=${HIGHEST_MAGEFILE}
1016     return 0
1017     }
1018    
1019    
1020     ###################################################
1021     # function is_config_protected #
1022     # is_config_protected /path/to/file #
1023     # #
1024     # returns: #
1025     # 0 - not protected #
1026     # 1 - error #
1027     # 2 - protected #
1028     # 3 - protected but masked #
1029     # #
1030     ###################################################
1031     is_config_protected() {
1032     local EXPFILE
1033     local TEST
1034     local PROTECTED
1035     local IFS
1036    
1037     EXPFILE=$1
1038    
1039     #to be safe; it may be '§'
1040     IFS=' '
1041    
1042     #check ob in config protect
1043     for i in ${CONFIG_PROTECT}
1044     do
1045     #ersetzen von $i nur wenn am anfang der variable
1046     TEST="${EXPFILE/#${i}/Protected}"
1047 niro 39 if [ "${TEST}" != "${EXPFILE}" ]
1048 niro 24 then
1049     #setzen das es protected ist
1050     PROTECTED=TRUE
1051    
1052     #check ob nicht doch maskiert
1053     for x in ${CONFIG_PROTECT_MASK}
1054     do
1055     TEST="${EXPFILE/#${x}/Protect_Masked}"
1056 niro 39 if [ "${TEST}" != "${EXPFILE}" ]
1057 niro 24 then
1058     PROTECTED=MASKED
1059     fi
1060     done
1061     fi
1062     done
1063    
1064     unset IFS
1065    
1066     case ${PROTECTED} in
1067     TRUE)
1068     #echo "I'm protected"
1069     return 2
1070     ;;
1071     MASKED)
1072     #echo "I'm protected, but masked - delete me"
1073     return 3
1074     ;;
1075     *)
1076     #echo "delete me"
1077     return 0
1078     ;;
1079     esac
1080     }
1081    
1082    
1083     ###################################################
1084     # function count_protected_files #
1085     # count_protected_files /path/to/file #
1086     # #
1087     # note: prints number of protected files #
1088     # exp: 0012 #
1089     ###################################################
1090     count_protected_files() {
1091 niro 39 ${MLIBDIR}/writeprotected "$1"
1092 niro 24 }
1093    
1094    
1095     #call with 'get_magefile_to_uninstall SEARCHSTRING'
1096     #returns /path/to/magefile
1097     get_magefile_to_uninstall() {
1098     local RESULT
1099     local SSTRING
1100     local i
1101     local x
1102     local z
1103    
1104     SSTRING=$1
1105    
1106     for i in ${INSTALLDB}/*/*
1107     do
1108     #echo ${i}
1109     #to be sure
1110     if [ -d ${i} ]
1111     then
1112     #echo "DEBUG: stripped i: $(basename ${i%-*-*})"
1113     if [ $(basename ${i%-*-*}) == ${SSTRING} ]
1114     then
1115     #RESULT="${RESULT} ${i}"
1116     CATEGORIE=$(< ${i}/.categorie)
1117     #echo ${CATEGORIE}/$(basename ${RESULT})
1118     RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})"
1119     fi
1120     fi
1121     done
1122    
1123     if [ -n "${RESULT}" ]
1124     then
1125     #check if ONE package was found and not more
1126     declare -i x=0
1127     for i in ${RESULT}
1128     do
1129     x=${x}+1
1130     done
1131     if [ ${x} -eq 1 ]
1132     then
1133     #echo "jo ich uninstall $(basename ${RESULT}) ..."
1134     #the mage file
1135     #echo "${RESULT}/$(basename ${RESULT}).mage"
1136    
1137     #gets categorie of the package
1138     #CATEGORIE=$(< ${i}/.categorie)
1139     #echo ${CATEGORIE}/$(basename ${RESULT})
1140     echo "${RESULT}"
1141     return 0
1142     else
1143     #echo "More than one package found ..."
1144     echo "${RESULT}"
1145     return 2
1146     fi
1147     else
1148     #echo "No package found named '${SSTRING}'."
1149     echo "${SSTRING}"
1150     return 1
1151     fi
1152     }
1153    
1154    
1155     # reads virtualdb file
1156     #$1 = virtualname; $2 commands: showpkgs, showline
1157     #return 0 == installed -> shows installed pkg as well
1158     #return 1 == not installed
1159     virtuals_read() {
1160     local VIRTUAL_NAME COMMAND VIRT_LINE line x i
1161    
1162     VIRTUAL_NAME=$1
1163     COMMAND=$2
1164    
1165     # parse file to get virtual_name line
1166     IFS=$'\n'
1167     for line in $(< ${VIRTUALDB_FILE})
1168     do
1169     IFS=$' '
1170     for x in ${line}
1171     do
1172     if [ "${x}" == "${VIRTUAL_NAME}" ]
1173     then
1174     VIRT_LINE="${line}"
1175    
1176     if [ "${COMMAND}" == "showline" ]
1177     then
1178     #give out the non stripped line
1179     echo "${line}"
1180     fi
1181     fi
1182     done
1183    
1184     IFS=$'\n'
1185     done
1186    
1187     unset IFS
1188    
1189     #now read the packages linked to VIRTUAL_NAME and output them
1190     if [ -n "${VIRT_LINE}" ]
1191     then
1192     if [ "${COMMAND}" == "showpkgs" ]
1193     then
1194     declare -i x=0
1195     for i in ${VIRT_LINE}
1196     do
1197     if [ ${x} -ge 1 ]
1198     then
1199     echo "${i}"
1200     fi
1201     ((x++))
1202     done
1203     fi
1204     return 0
1205     fi
1206     return 1
1207     }
1208    
1209    
1210     #add pkg to virtualdb
1211     # $1 == virtualname $2= pkgname
1212     # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1213     virtuals_add(){
1214     local VIRTUAL_NAME PKG_NAME OLD_LINE line i
1215    
1216     VIRTUAL_NAME=$1
1217     PKG_NAME=$2
1218    
1219    
1220     if virtuals_read ${VIRTUAL_NAME}
1221     then
1222     #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1223     for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1224     do
1225     if [ "${i}" == ${PKG_NAME} ]
1226     then
1227     echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..."
1228     return 3
1229     fi
1230     done
1231    
1232     echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..."
1233     OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1234    
1235     #make a backup
1236     mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1237    
1238     IFS=$'\n'
1239     for line in $(< ${VIRTUALDB_FILE}.old)
1240     do
1241     #if the right line, append ${PKG_NAME}, else do nothing
1242     if [ "${line}" == "${OLD_LINE}" ]
1243     then
1244     echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE}
1245     else
1246     echo "${line}" >> ${VIRTUALDB_FILE}
1247     fi
1248     done
1249    
1250     unset IFS
1251     else
1252     echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..."
1253     echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \
1254     && echo "ok" || echo "false"
1255     fi
1256    
1257     return 0
1258     }
1259    
1260     #deletes pakages from virtual database
1261     #$1 virtualname; $2 pkgname
1262     virtuals_del() {
1263    
1264     local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED
1265    
1266     VIRTUAL_NAME=$1
1267     PKG_NAME=$2
1268    
1269     #first check if exists
1270     if virtuals_read ${VIRTUAL_NAME}
1271     then
1272     #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1273     declare -i x=0
1274     for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1275     do
1276     if [ "${i}" == "${PKG_NAME}" ]
1277     then
1278     PKG_INSTALLED=true
1279     fi
1280     ((x++))
1281     done
1282    
1283     #abort if not installed
1284     if [ "${PKG_INSTALLED}" != "true" ]
1285     then
1286     echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."
1287     return 0
1288     fi
1289    
1290     if [ ${x} -ge 2 ]
1291     then
1292     METHOD=update
1293     else
1294     METHOD=delall
1295     fi
1296    
1297     #get the complete line
1298     OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1299    
1300     #make a backup
1301     mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1302    
1303     #parse virtualdb
1304     IFS=$'\n'
1305     for line in $(< ${VIRTUALDB_FILE}.old)
1306     do
1307     if [ "${line}" == "${OLD_LINE}" ]
1308     then
1309     #delall or update?
1310     case ${METHOD} in
1311     update)
1312     echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."
1313     #del PKG_NAME from line
1314     echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}
1315     ;;
1316     delall)
1317     echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."
1318     #continue; do not write anything
1319     continue
1320     ;;
1321     esac
1322     else
1323     echo "${line}" >> ${VIRTUALDB_FILE}
1324     fi
1325     done
1326     unset IFS
1327     else
1328     echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."
1329     fi
1330     }
1331    
1332     # gets real pkgname from virtuals.default
1333     #$1=VIRTUAL_NAME; returns PKG_NAME
1334     default_virtualname_to_pkgname(){
1335     local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1336    
1337     VIRTUAL_NAME=$1
1338    
1339     while read db_virtualname db_pkgname
1340     do
1341     if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1342     then
1343     PKG_NAME="${db_pkgname}"
1344     fi
1345     done << EOF
1346     $(< ${VIRTUALDB_DEFAULTS})
1347     EOF
1348    
1349     if [ -n "${PKG_NAME}" ]
1350     then
1351     echo "${PKG_NAME}"
1352     fi
1353     }

Properties

Name Value
svn:executable *