Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 176 - (hide annotations) (download) (as text)
Sun Jul 31 14:48:22 2005 UTC (18 years, 9 months ago) by niro
File MIME type: application/x-sh
File size: 30966 byte(s)
fixed typos

1 niro 24 #!/bin/bash
2     # Magellan Linux Installer Functions (mage.functions.sh)
3 niro 176 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage3.functions.sh,v 1.12 2005-07-31 14:48:22 niro Exp $
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 niro 81 touch -c -m -r ${DB_ENTRY}/.mtime ${pathto}
53 niro 24 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 niro 81 touch -c -m -r ${DB_ENTRY}/.mtime ${pathto}
84 niro 24 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 niro 171
749     # check if an newer mage version is available
750     is_newer_mage_version_available
751 niro 24 }
752    
753     cleanpkg(){
754     if [ -d "$PKGDIR" ]
755     then
756     echo -n "Removing downloaded packages... "
757     rm -rf ${PKGDIR}/*
758     echo "done."
759     fi
760     }
761    
762     ###################################################
763     # function keepfiles #
764     # keepfiles "$CATEGORIE/$PNAME" "$filename" #
765     # note wildchars allowed #
766     ###################################################
767     keepfiles() {
768     local name
769     local keep
770     name="`echo $1| cut -d '/' -f2`"
771     keep="$2"
772    
773     DELPKG="`find ${INSTALLDB} -name ${name}*.mage`"
774     DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)"
775     cp ${DELDIR}/.files ${DELDIR}/.files-orig
776     sed "s:${keep}::" \
777     ${DELDIR}/.files-orig > ${DELDIR}/.files
778     rm ${DELDIR}/.files-orig
779     }
780    
781    
782     ###################################################
783     # function injectpkg #
784     # injectpkg "$CATEGORIE/$PNAME" #
785     # note wildchars allowed #
786     ###################################################
787     injectpkg() {
788     local name
789     local categorie
790     local magename
791     name="`echo $1| cut -d '/' -f2`"
792     categorie="`echo $1| cut -d '/' -f1`"
793    
794     INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`"
795     for i in ${INJPKG}
796     do
797     magename="$(basename ${INJPKG} .mage)"
798     echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}"
799     install -d ${INSTALLDB}/${magename}
800     touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char}
801    
802     #installs magefile
803     install -m 0644 -o root -g root \
804     ${MAGEDIR}/${categorie}/${magename}.mage \
805     ${INSTALLDB}/${magename}
806     done
807     }
808    
809     ###################################################
810     # function reminjected #
811     # reminjected #
812     # note: removes all injected packages #
813     ###################################################
814     reminjected() {
815     DELINJ="`find ${INSTALLDB} -name .injected`"
816     for i in ${DELINJ}
817     do
818     magename=$(dirname ${i})
819     if [ -d "${magename}" ]
820     then
821     # small fix to protect the mage-db deleting itself, that is not so funny :)
822     if [ "${magename}" != "${INSTALLDB}" ]
823     then
824     echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}"
825     rm -rf ${magename}
826     fi
827     fi
828     done
829     }
830    
831    
832     xtitle() {
833     if [ ${TERM} == "xterm" ]
834     then
835     echo -ne "\033]0;Mage: $1\007"
836     fi
837     return 0
838     }
839    
840    
841     xtitleclean() {
842     if [ ${TERM} == "xterm" ]
843     then
844     echo -ne "\033]0;\007"
845     fi
846     return 0
847     }
848    
849    
850     spin_processbar() {
851    
852     # does not works as it should -- disabled
853     # you musst add and remove a tempfile outside this funktion
854     # to leave this funktion ...
855    
856     # before you call this function do this:
857     #
858     # touch /var/tmp/proz
859     # build_doinstall|spin_processbar
860    
861     echo -en "Processing: "
862     while [ -f /var/tmp/proz ]
863     do
864     echo -en "-\b"
865     sleep 0.01
866     echo -en "\\ \b\b"
867     sleep 0.01
868     echo -en "|\b"
869     sleep 0.01
870     echo -en "/\b"
871     sleep 0.01
872     done
873     echo "done"
874     return 0
875    
876     # when you want to leave the funktion do
877     # something like this:
878     #
879     # #remove spinner tempfile
880     # if [ "$VERBOSE" == "off" ]
881     # then
882     # if [ -f /var/tmp/proz ]
883     # then
884     # rm /var/tmp/proz
885     # fi
886     # fi
887    
888     }
889    
890    
891     #cuts full pathnames or versioniezed names down to basename
892     choppkgname(){
893     #we want this only if full name was used
894     if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
895     then
896     #cuts ARCH and PBUILD
897     #ARCH comes from /etc/mage.rc
898     MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
899    
900     #cuts version number
901     MAGENAME=$(basename ${MAGENAME%-*} .mage)
902     fi
903     }
904    
905    
906     # get_categorie $PKGNAME, returns CATEGORIE
907     # ret 0=ok, 1=not_found
908     getcategorie(){
909     for CAT in ${MAGEDIR}/*
910     do
911     if [ -d ${CAT}/${MAGENAME} ]
912     then
913     #debug only
914     if [ "$MAGEDEBUG" == "on" ]
915     then
916     echo "$MAGENAME found -> $CAT/$MAGENAME"
917     echo "categorie = $(basename ${CAT})"
918     fi
919     CATEGORIE=$(basename ${CAT})
920     fi
921     done
922    
923     #package does not exists
924     if [ -z "$CATEGORIE" ]
925     then
926     echo -e "Package "${COLRED}"\"${MAGENAME}\""${COLDEFAULT}" does not exists."
927     exit 1
928     fi
929     }
930    
931    
932     #check_stable_package /path/to/foo.mage
933     # returns 0=stable 1=unstable
934     check_stable_package(){
935     #be sure no previous $STATES exists
936     unset STATE
937    
938     source $1
939    
940     #if USE_UNSTABLE=true this must be prevented
941     if [ "${USE_UNSTABLE}" != "true" ]
942     then
943     if [ "${STATE}" != "stable" ]
944     then
945     return 1
946     else
947     if [ "${STATE}" == "old" ]
948     then
949     return 1
950     fi
951     fi
952     fi
953    
954     #unset the sourced varibales;
955     #we'll got bad problems later on if we don't do this
956     unset PKGNAME
957     unset STATE
958     unset DESCRIPTION
959     unset HOMEPAGE
960     unset DEPEND
961     unset SDEPEND
962     unset PROVIDE
963     unset PKGTYPE
964     unset preinstall
965     unset postinstall
966    
967     return 0
968     }
969    
970    
971     #get_highest_magefile ${CATEGORIE} ${PKGNAME}
972     #fake at moment returns only stable pkgs (must set to be one)
973     # return $HIGHEST_MAGEFILE
974     get_highest_magefile(){
975     unset HIGHEST_MAGEFILE
976     #CATEGORIE=$1
977     #PKGNAME=$2
978    
979     for i in ${MAGEDIR}/${CATEGORIE}/${MAGENAME}/*
980     do
981     #we exclude subdirs (for stuff like a md5sum dir)
982     if [ ! -d ${i} ]
983     then
984     check_stable_package ${i}
985     if [ "$?" == "0" ]
986     then
987     HIGHEST_MAGEFILE=${i}
988     #for debug only
989     if [ "$MAGEDEBUG" == "on" ]
990     then
991     echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
992     fi
993     fi
994     fi
995     done
996    
997 niro 31 # stop here if HIGHEST_MAGEFILE is zero
998     # this package must be unstable or old
999     if [ -z "${HIGHEST_MAGEFILE}" ]
1000     then
1001     echo
1002     echo -n "All packages named "
1003     echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1004     echo -n " are marked "
1005     echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1006     echo "."
1007     echo "You need to declare USE_UNSTABLE=true to install this."
1008     echo
1009     echo "Example:"
1010     echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1011     echo
1012     echo "Be warned that these packages are not stable and may cause serious problems."
1013     echo "You should know what you are doing, so don't complain about any damage."
1014     echo
1015 niro 36 return 1
1016 niro 31 fi
1017    
1018 niro 24 MAGEFILE=${HIGHEST_MAGEFILE}
1019     return 0
1020     }
1021    
1022    
1023     ###################################################
1024     # function is_config_protected #
1025     # is_config_protected /path/to/file #
1026     # #
1027     # returns: #
1028     # 0 - not protected #
1029     # 1 - error #
1030     # 2 - protected #
1031     # 3 - protected but masked #
1032     # #
1033     ###################################################
1034     is_config_protected() {
1035     local EXPFILE
1036     local TEST
1037     local PROTECTED
1038     local IFS
1039    
1040     EXPFILE=$1
1041    
1042     #to be safe; it may be '§'
1043     IFS=' '
1044    
1045     #check ob in config protect
1046     for i in ${CONFIG_PROTECT}
1047     do
1048     #ersetzen von $i nur wenn am anfang der variable
1049     TEST="${EXPFILE/#${i}/Protected}"
1050 niro 39 if [ "${TEST}" != "${EXPFILE}" ]
1051 niro 24 then
1052     #setzen das es protected ist
1053     PROTECTED=TRUE
1054    
1055     #check ob nicht doch maskiert
1056     for x in ${CONFIG_PROTECT_MASK}
1057     do
1058     TEST="${EXPFILE/#${x}/Protect_Masked}"
1059 niro 39 if [ "${TEST}" != "${EXPFILE}" ]
1060 niro 24 then
1061     PROTECTED=MASKED
1062     fi
1063     done
1064     fi
1065     done
1066    
1067     unset IFS
1068    
1069     case ${PROTECTED} in
1070     TRUE)
1071     #echo "I'm protected"
1072     return 2
1073     ;;
1074     MASKED)
1075     #echo "I'm protected, but masked - delete me"
1076     return 3
1077     ;;
1078     *)
1079     #echo "delete me"
1080     return 0
1081     ;;
1082     esac
1083     }
1084    
1085    
1086     ###################################################
1087     # function count_protected_files #
1088     # count_protected_files /path/to/file #
1089     # #
1090     # note: prints number of protected files #
1091     # exp: 0012 #
1092     ###################################################
1093     count_protected_files() {
1094 niro 39 ${MLIBDIR}/writeprotected "$1"
1095 niro 24 }
1096    
1097    
1098     #call with 'get_magefile_to_uninstall SEARCHSTRING'
1099     #returns /path/to/magefile
1100     get_magefile_to_uninstall() {
1101     local RESULT
1102     local SSTRING
1103     local i
1104     local x
1105     local z
1106    
1107     SSTRING=$1
1108    
1109     for i in ${INSTALLDB}/*/*
1110     do
1111     #echo ${i}
1112     #to be sure
1113     if [ -d ${i} ]
1114     then
1115     #echo "DEBUG: stripped i: $(basename ${i%-*-*})"
1116     if [ $(basename ${i%-*-*}) == ${SSTRING} ]
1117     then
1118     #RESULT="${RESULT} ${i}"
1119     CATEGORIE=$(< ${i}/.categorie)
1120     #echo ${CATEGORIE}/$(basename ${RESULT})
1121     RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})"
1122     fi
1123     fi
1124     done
1125    
1126     if [ -n "${RESULT}" ]
1127     then
1128     #check if ONE package was found and not more
1129     declare -i x=0
1130     for i in ${RESULT}
1131     do
1132     x=${x}+1
1133     done
1134     if [ ${x} -eq 1 ]
1135     then
1136     #echo "jo ich uninstall $(basename ${RESULT}) ..."
1137     #the mage file
1138     #echo "${RESULT}/$(basename ${RESULT}).mage"
1139    
1140     #gets categorie of the package
1141     #CATEGORIE=$(< ${i}/.categorie)
1142     #echo ${CATEGORIE}/$(basename ${RESULT})
1143     echo "${RESULT}"
1144     return 0
1145     else
1146     #echo "More than one package found ..."
1147     echo "${RESULT}"
1148     return 2
1149     fi
1150     else
1151     #echo "No package found named '${SSTRING}'."
1152     echo "${SSTRING}"
1153     return 1
1154     fi
1155     }
1156    
1157    
1158     # reads virtualdb file
1159     #$1 = virtualname; $2 commands: showpkgs, showline
1160     #return 0 == installed -> shows installed pkg as well
1161     #return 1 == not installed
1162     virtuals_read() {
1163     local VIRTUAL_NAME COMMAND VIRT_LINE line x i
1164    
1165     VIRTUAL_NAME=$1
1166     COMMAND=$2
1167    
1168     # parse file to get virtual_name line
1169     IFS=$'\n'
1170     for line in $(< ${VIRTUALDB_FILE})
1171     do
1172     IFS=$' '
1173     for x in ${line}
1174     do
1175     if [ "${x}" == "${VIRTUAL_NAME}" ]
1176     then
1177     VIRT_LINE="${line}"
1178    
1179     if [ "${COMMAND}" == "showline" ]
1180     then
1181     #give out the non stripped line
1182     echo "${line}"
1183     fi
1184     fi
1185     done
1186    
1187     IFS=$'\n'
1188     done
1189    
1190     unset IFS
1191    
1192     #now read the packages linked to VIRTUAL_NAME and output them
1193     if [ -n "${VIRT_LINE}" ]
1194     then
1195     if [ "${COMMAND}" == "showpkgs" ]
1196     then
1197     declare -i x=0
1198     for i in ${VIRT_LINE}
1199     do
1200     if [ ${x} -ge 1 ]
1201     then
1202     echo "${i}"
1203     fi
1204     ((x++))
1205     done
1206     fi
1207     return 0
1208     fi
1209     return 1
1210     }
1211    
1212    
1213     #add pkg to virtualdb
1214     # $1 == virtualname $2= pkgname
1215     # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1216     virtuals_add(){
1217     local VIRTUAL_NAME PKG_NAME OLD_LINE line i
1218    
1219     VIRTUAL_NAME=$1
1220     PKG_NAME=$2
1221    
1222    
1223     if virtuals_read ${VIRTUAL_NAME}
1224     then
1225     #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1226     for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1227     do
1228     if [ "${i}" == ${PKG_NAME} ]
1229     then
1230     echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..."
1231     return 3
1232     fi
1233     done
1234    
1235     echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..."
1236     OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1237    
1238     #make a backup
1239     mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1240    
1241     IFS=$'\n'
1242     for line in $(< ${VIRTUALDB_FILE}.old)
1243     do
1244     #if the right line, append ${PKG_NAME}, else do nothing
1245     if [ "${line}" == "${OLD_LINE}" ]
1246     then
1247     echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE}
1248     else
1249     echo "${line}" >> ${VIRTUALDB_FILE}
1250     fi
1251     done
1252    
1253     unset IFS
1254     else
1255     echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..."
1256     echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \
1257     && echo "ok" || echo "false"
1258     fi
1259    
1260     return 0
1261     }
1262    
1263     #deletes pakages from virtual database
1264     #$1 virtualname; $2 pkgname
1265     virtuals_del() {
1266    
1267     local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED
1268    
1269     VIRTUAL_NAME=$1
1270     PKG_NAME=$2
1271    
1272     #first check if exists
1273     if virtuals_read ${VIRTUAL_NAME}
1274     then
1275     #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1276     declare -i x=0
1277     for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1278     do
1279     if [ "${i}" == "${PKG_NAME}" ]
1280     then
1281     PKG_INSTALLED=true
1282     fi
1283     ((x++))
1284     done
1285    
1286     #abort if not installed
1287     if [ "${PKG_INSTALLED}" != "true" ]
1288     then
1289     echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."
1290     return 0
1291     fi
1292    
1293     if [ ${x} -ge 2 ]
1294     then
1295     METHOD=update
1296     else
1297     METHOD=delall
1298     fi
1299    
1300     #get the complete line
1301     OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1302    
1303     #make a backup
1304     mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1305    
1306     #parse virtualdb
1307     IFS=$'\n'
1308     for line in $(< ${VIRTUALDB_FILE}.old)
1309     do
1310     if [ "${line}" == "${OLD_LINE}" ]
1311     then
1312     #delall or update?
1313     case ${METHOD} in
1314     update)
1315     echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."
1316     #del PKG_NAME from line
1317     echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}
1318     ;;
1319     delall)
1320     echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."
1321     #continue; do not write anything
1322     continue
1323     ;;
1324     esac
1325     else
1326     echo "${line}" >> ${VIRTUALDB_FILE}
1327     fi
1328     done
1329     unset IFS
1330     else
1331     echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."
1332     fi
1333     }
1334    
1335     # gets real pkgname from virtuals.default
1336     #$1=VIRTUAL_NAME; returns PKG_NAME
1337     default_virtualname_to_pkgname(){
1338     local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1339    
1340     VIRTUAL_NAME=$1
1341    
1342     while read db_virtualname db_pkgname
1343     do
1344     if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1345     then
1346     PKG_NAME="${db_pkgname}"
1347     fi
1348     done << EOF
1349     $(< ${VIRTUALDB_DEFAULTS})
1350     EOF
1351    
1352     if [ -n "${PKG_NAME}" ]
1353     then
1354     echo "${PKG_NAME}"
1355     fi
1356     }
1357 niro 171
1358     minclude() {
1359     local i
1360    
1361     if [ -n "$@" ]
1362     then
1363     for i in $@
1364     do
1365 niro 176 echo "--- Including ${MAGEDIR}/include/${i}.minc"
1366 niro 171 source ${MAGEDIR}/include/${i}.minc
1367     done
1368     fi
1369     }
1370    
1371     sminclude() {
1372     local i
1373    
1374     if [ -n "$@" ]
1375     then
1376     for i in $@
1377     do
1378 niro 176 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1379 niro 171 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1380     done
1381     fi
1382     }
1383    
1384     # checks if an newer mage version is available
1385     is_newer_mage_version_available() {
1386     local newest_mage
1387     local installed_mage
1388    
1389     newest_mage="$( CATEGORIE=app-mage MAGENAME=mage get_highest_magefile;echo $(basename ${MAGEFILE} .mage) )"
1390     installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1391    
1392     if [[ ${newest_mage} > ${installed_mage} ]]
1393     then
1394     echo
1395     echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1396     echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1397     echo "It is recommened to install this newer version"
1398     echo "or your current system installation may brake."
1399     echo
1400     echo -en "Please update mage by running "
1401     echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1402     echo
1403     fi
1404     }
1405    

Properties

Name Value
svn:executable *