# mehrere distfiles verzeichnisse?

## sarahb523

Hi,

gibt es ne möglichkeit mehr als ein distfiles directory zu definieren? Ich habe oft quellen auf cd/dvd. Ich möchte das (aus paltzgründen) nicht immer in /usr/portage/distfiles kopieren. Allerdings hab ich in diesem verzeichnis auch dateien (die ich selbst heruntergeladen habe) die ich brauche. Klar ich könnte immer ein anderes $DISTDIR definieren, aber das setzt immer vorraus das ich weiß wo die betreffende datei liegt. Das ist aber extrem umständlich und macht mehr arbeit als es nutzt.

----------

## Romses

Hi

Das klingt für mich nach einem Fall für Portage Overlay

oder verstehe ich dich da falsch?

Gruß Romses

----------

## sarahb523

gilt das auch für distfiles? denn wenn ich sachen die im overlay liegen download (bzw. emerge downloaded) landen die in /usr/portage/distfiles. Dies verhalten finde ich auch okay. 

Allerdings würde ich gern noch 2 weitere $DISTDIR 's nach /media/dvd und nach /home/daten2/archiv/distfiles legen. Also instgesamt möchte ich das emerge an 3 orten nach distfiles sucht bevor es welche herunterlädt. Wenn was heruntergeladen wird soll es in /usr/portage/distfiles landen.

----------

## psyqil

Also, der Amiga konnte das...  :Wink: 

Wie wäre denn, file://media/dvd bei GENTOO_MIRRORS einzutragen?

----------

## Anarcho

 *psyqil wrote:*   

> Also, der Amiga konnte das... 
> 
> Wie wäre denn, file://media/dvd bei GENTOO_MIRRORS einzutragen?

 

Klingt nicht schlecht, würde aber bedeuten das er die Sachen dann doch in das normale distfiles kopiert, denn er würde sie ja trotzdem runterladen, nur eben von Platte oder CD/DVD.

Dann kann man sie auch manuell kopieren.

Das einzige was mir so spontan einfallen würde, wäre ein script welches links auf alle anderen Dateien macht und ein aufräumscript, welches die Links wieder beseitigt.

Alternativ kannst du dir auch ein Script schreiben, welches parameter gesteuert distfiles als link setzt. 

Dann benennst du distfiles in distfiles-alt (oder was anderes) um und setzt nen link mit namen distfiles drauf. 

Wenn das Script dann mit parameter "dvd" aufgerufen wird, dann löscht es den link und setzt nen neuen auf das dvd-laufwerk, analog mit der anderen  platte.

Nur so ein paar überlegungen....

----------

## psyqil

file://... macht wget auch nicht mit, schade...

mount -bind wäre nicht ganz schlecht, aber da kann man genausogut $DISTDIR ändern...

Nee, symlinks klingen erstmal gut, prima Idee, man muß die vielleicht auch gar nicht jedesmal löschen, solange sie noch aktuell sind, d.h. die CD/DVD noch irgendwo existiert!

----------

## equinox0r

wenn ihr dazu was rausgefunden habt würde mich das sehr interessieren  :Smile: 

hatte eine art "distdir_overlay" im sinn, aber das gibts ja leider nicht .. 

ich hab das jetzt mit distfiles auf fileserver via nfs gelöst.. prinzipiell wär so ein overlay aber nicht verkehrt ...

----------

## sarahb523

das mit den links hört sich gut an. 

Man könnte ein eigenes fetch command machen (wie im "75% weniger downloads" thread). Dieses würde schauen ob es die geforderte datei in den alternativen dir's gibt (im distfiles ist es ja nich, da das fetch aufgerufen wird). Wenn es die datei in den alternativen dirs gibt, wird ein link in's reguläre distfiles gemacht. 

Der vorteil: 

es existieren nur links zu files die man wirklich gemerged hat

nachteil:

links bleiben immer erhalten, also es wird nicht aufgeräumt (wie auch bei den regulären datein in distfiles).

Um das zu lösen könnte man ein script schreiben, welche alle (evtl. nur die toten) links löscht. ODER wenn es ein command aufruf (wie die fetchcommand variable) gibt, welches nach der install aufgerufen wird, könnte man den betreffenden link ja auch gleich wieder löschen. Dann bleibt distfiles immer sauber

Man könnte das ganze noch so erweitern, das man beim fetch gefragt wird ob automatisch cd/nfs/.. eingebunden werden soll.

----------

## sarahb523

da ich gerade irgendwie nich schlafen und auch nich sonderlich müde bin hab ich mal was gebastelt. Erklärungen wie es geht steht im script header. Mir ist bewußt das mein script noch nicht ausgereift ist und ggf. etwas umständlich ist. Wer verbesserungsvorschläge/erweiterungen hat, kann sie hier gleich mal posten

Als basis diente mir das getdeltup.sh script - thx to the author  :Very Happy: 

EDIT

um ein wenig platz zu sparen. hab ich hier den code rausgenommen. der neuere code siehe 2 postings weiter unten.

----------

## equinox0r

i love you !!!  :Smile:   :Smile:   :Smile:   :Smile: 

ich mach mich mal an "# - colored and better formated output" dran  :Wink: 

----------

## sarahb523

 *equinox0r wrote:*   

> 
> 
> i love you !!!     
> 
> ich mach mich mal an "# - colored and better formated output" dran
> ...

 

1) das macht schon jemand anders, aber trotzdem danke  :Smile: 

2) das hab ich mal so nebenbei auch erledigt 

ich wäre an einem guten system für das löschen interessiert. Also dafür sollte man auf der konsole z.b.

dist_overlay.sh --clean-all-dead

aufrufen um das distfiles zu säubern. Schön wäre auch wenn man das ganze mit loggt und dann später nur die geloggten files löscht

EDIT: code aktualisiert

```

#!/bin/bash 

 # distfiles overlay script - dist_overlay.sh 

 # 

 # version 0.2.3

 # INSTALL 

 # - copy this script to /usr/local/bin 

 # - add  FETCHCOMMAND="/usr/local/bin/dist_overlay.sh \${URI}" to make.conf 

 # - modify following var's to your needs or set it in make.conf 

 # var's in make.conf have higher priority 

 # see http://forums.gentoo.org/viewtopic.php?p=1535632 

 # 

 

 # a : seperated list to the directories containing distfiles 

 # (cd-rom/dvd-rom/samba/nfs are checked to be mount) 

 DISTDIRS="/mnt/dvd:/mnt/cdrecorder" 

 

 # command for fetching the file, if it wasn't found. 

 #DIST_FETCH="/usr/local/bin/getdelta.sh"   # for deltup user 

 DIST_FETCH="/usr/bin/wget -t 1 --passive-ftp" 

 

 #file for log activity, enter a empty string to disable log writing 

 DIST_LOG="/var/log/dist_overlay.log" 

 

 # set true for coping a file instead of making a link 

 DIST_COPY=false

# be more verbose

 DIST_VERBOSE=false

 #### planed for further releases 

 # other distfiles location which needs to be mounted 

 # (nfs,cd,dvd,samba,...) 

 # MOUNT_DISTDIRS="" 

 

 # set to true to search for distfiles in subdirectories 

 DIST_DEEPSCAN=true

 

 # options for find in deepscan 

 DIST_DEEPSCAN_OPTS="-follow" 

 

 ########################################################### 

 # ---! you do not need to change anything below this !--- # 

 #                                                         # 

 ########################################################### 

 # include variables from gentoo make.globals and make.conf 

 source /etc/make.globals 

 source /etc/make.conf 

 # some colors for colored output 

 

 if $COLOR 

 then 

    RED="\033[01;31m" 

    GREEN="\033[01;32m" 

    YELLOW="\033[01;33m" 

    BLUE="\033[01;34m" 

    MAGENTA="\033[01;35m" 

    CYAN="\033[01;36m" 

    NORMAL="\033[00m" 

 else 

    RED="" 

    GREEN="" 

    YELLOW="" 

    BLUE="" 

    MAGENTA="" 

    CYAN="" 

    NORMAL="" 

 fi 

 

 # log writing stuff 

 function write_log { 

    if [ -n "$DIST_LOG" ]; then 

       stamp=`date +%s` 

       echo "$stamp: $@" >> $DIST_LOG 

    fi

    if ${DIST_VERBOSE} ; then

       echo " >>> $stamp: $@"

   fi

 } 

 

 # deleting symlinks (from clean mode) 

 function delete { 

    write_log "(DELETE/CLEAN) $DISTDIR/$1" 

    echo -e "${RED}\n*${NORMAL} Deleting symlink $1 (no such file)\n"; 

    rm $DISTDIR/$1 

 } 

 

 # clean dead symlinks in $DISTDIR 

 function clean { 

    link_files=`ls -l "$1"| grep ^l| awk '{print $9}'` 

    for name in $link_files; do [ -f $name ] || delete $name; done 

 } 

 

 # copy or symlink distfile to $DISTDIR 

 function get_distfile { 

    FILE="$1" 

    DIR="$2" 

 

    echo -e "${GREEN}file found!\n${NORMAL}" 

 

    if  ${DIST_COPY} ; then 

       write_log "(COPY) $1 ($DISTDIR)" 

       echo -e "${GREEN} * ${NORMAL} copy file to distfiles\n\n" 

       cp $2/$1 $DISTDIR 

    else 

       write_log "(SYMLINK) $1 ($DISTDIR -> $2)" 

       echo -e "${GREEN} * ${NORMAL} make a link from file to distfiles\n\n" 

       ln -sf $2/$1 $DISTDIR/$1 

    fi 

 

    FETCHED=true 

    break 

 } 

 

 # search for distfiles in overlay 

 function scan { 

    ORIG_URI="$1" 

    NEW_FILE=$(basename "$ORIG_URI") 

       

    echo -e "${GREEN}\n * ${NORMAL}searching for $NEW_FILE" 

    DIR=`echo $DISTDIRS | cut -d ":" -f 1` 

     

    i=1 

    FETCHED=false 

   

    while [[ -n "$DIR" ]] 

    do 

       echo -ne "    ${NORMAL}scanning $DIR ... " 

 

       # DIST_DEEPSCAN for searching in subdirectories 

       if ( ${DIST_DEEPSCAN} ); then 

          DIST_FIND_RESULT=`find "$DIR" ${DIST_DEEPSCAN_OPTS} -name "$NEW_FILE"`

          if [ -n "$DIST_FIND_RESULT"  ]; then 

             get_distfile $NEW_FILE $DIR 

          fi    

       elif [ -e "$DIR/$NEW_FILE" ]; then 

           get_distfile $NEW_FILE $DIR 

       fi 

       

 

       echo -e "${YELLOW}file not found.${NORMAL}" 

 

       i=`expr $i + 1` 

       DIR=`echo $DISTDIRS | cut -d ":" -f $i` 

    done 

 

    if ! ${FETCHED}; then 

       write_log "(FETCH) $ORIG_URI" 

       echo -e "${RED}\n * Requested file is not in distfiles overlay." 

       echo -e "${GREEN} * ${NORMAL}Fetching file from original URI\n   $ORIG_URI\n" 

       $DIST_FETCH -O $DISTDIR/$NEW_FILE $ORIG_URI 

    fi 

 } 

 

 case "$1" in 

    "clean") 

       clean $DISTDIR 

    ;; 

    *) 

       scan $1 

    ;; 

 esac 

  

 exit 0

```

----------

## sarahb523

leider funzt deltup jetzt nicht mehr, ich denke da gibts irgendwelche konflike mit den var names in den scripten, ich checke das mal

EDIT

hab den fehler gefunden und oben korrigiert. getdeltup.sh und dist_overlay.sh haben beide die variable FETCH genutzt. Dadurch gabs eine lustige rekursion seintens getdeltup.sh. Ich habe nun im script FETCH durch DIST_FETCH getauscht. In meiner make.conf hab ich DIST_FETCH="/usr/local/bin/getdelta.sh"

da ich deltup benutze. Mein DISTDIRS hab ich auch in die make.conf gepackt, das is irgendwie sauberer  :Wink: 

 - so und jetzt geh ich schlafen!

----------

## equinox0r

ich hab das für meine zwecke noch etwas abgeändert, teilweise vervollständigt etc, aber noch nicht getestet.. mein rechner daheim ist abgeschmiert bzw. fährt nicht mehr hoch, kanns also erst heute mittag testen ...

danke nochmal sarah, is was nettes draus  geworden  :Very Happy: 

EDIT: code rausgenommen um platz zu sparen ...

das vollständige gibts 2 threads weiter oben  :Wink: 

EDIT: neue version 0.3.2 ist jetz unter https://forums.gentoo.org/viewtopic.php?p=1561711#1561711 zu finden ... (bis sarah die alte version 2 threads weiter oben upgedated hat .... )

----------

## sarahb523

ich habe es jetzt noch nicht großartig getestet, aber es scheint zu gehen. Weiterhin habe ich oben noch mal ein paar schönheitskorrekturen gemacht und auch noch ne "copy distfiles" funktion reingebastelt, denn das könnte evtl. auch ganz nützlich sein.

----------

## equinox0r

hmm...

```
DIST_FETCH="/usr/bin/wget -t 1 --passive-ftp -O $DISTDIR"
```

das "-O $DISTDIR" fand ich schon ganz praktisch bzw. sicherer, falls mal irgendwo was schiefgehen sollte ... deshalb hab ich auch "source /etc/make.conf" nach oben gezogen...

werd das morgen mal bei mir richtig testen  :Smile: 

moep an alle

equi

EDIT abgeändert in:

```
DIST_FETCH="/usr/bin/wget -t 1 --passive-ftp -O ${URI}"
```

-O braucht einen dateinamen

----------

## sarahb523

habs oben geändert. ich bin heute auch schon am testen, bisher keine probleme...

----------

## equinox0r

 *sarahb523 wrote:*   

> 
> 
> ```
>        if [ -e "$DIR/$NEW_FILE" ]; then
> 
> ...

 

tust du da bitte noch was abändern? (log-krams)

```
       if [ -e "$DIR/$NEW_FILE" ]; then

          echo -e "${GREEN}file found!\n${NORMAL}"

          if [ $DIST_COPY = "1" ]; then

            write_log "(COPY) $NEW_FILE ($DISTDIR)"

            echo -e "${GREEN} * ${NORMAL} copy file to distfiles\n\n"

            cp $DIR/$NEW_FILE $DISTDIR

          else

            write_log "(SYMLINK) $NEW_FILE ($DISTDIR -> $DIR)"

            echo -e "${GREEN} * ${NORMAL} make a link from file to distfiles\n\n"

            ln -sf $DIR/$NEW_FILE $DISTDIR/$NEW_FILE

          fi

          FETCHED=true

          break

       fi
```

merci  :Smile: 

----------

## equinox0r

 *sarahb523 wrote:*   

> Man könnte das ganze noch so erweitern, das man beim fetch gefragt wird ob automatisch cd/nfs/.. eingebunden werden soll.

 

was genau meinst du eigentlich damit?

----------

## sarahb523

naja man könnte eine liste von temporär vorhandenen laufwerken (cd,smb,nfs,...) definieren, die dann wenn sie nicht eingebunden sind, eingebunden werden. Dann könnte man noch eine var IGNORE_MOUNT_FAIL machen. Wenn diese gesetzt ist, wird ein mount fehler ignoriert. Wenn diese nicht gesetzt ist, wird der user gefragt was  zu machen ist (abort,retry,ignore). dies kann praktisch sein wenn man vergessen hat die cd einzulegen oder den netz-pc einzuschalten. außerdem muß man nicht mehr selbst mounten. Mit einer var "AUTO_UMOUNT" könnte man nach abschluß des scriptes die laufwerke wieder unmounten. Dies macht aber nur bei schnelleren netzlaufwerken sinn, da das ständige mount/umount bei z.b. einem emerge -u world viel zeit fressen würde.

Also im prinzip bin ich erstmal mit dem zufrieden so wie es ist, allerdings könnte man in dem script noch ne menge reinbasteln. irgendwann könnte man das auch noch mit dem deltup script zu einem "ultimate-fetch-script" verschmelzen. Mir würden spontan auch noch ein paar weitere sachen einfallen, z.b. prüfung der datei, falls fehlerhaft wird kein link gemacht und ggf. im nächsten distdir gesucht.

Ehrlich gesagt hätte ich nicht gedacht wie komplex das "herunterladen" der distfiles werden kann, aber linux/gentoo läßt einem hier soviel kreative freiheit....

----------

## equinox0r

bin jetzt grad bissl am basteln und hab da was zusammengescriptet, mit dem man diese liste realisieren könnte, aber das ist keine feine lösung finde ich ....

```
TMP_DISTDIRS=(/dev/hda1 /mnt/bla /dev/hdb1 /mnt/xxx /dev/hdc4 /mnt/blubb)

VAR=0

LIMIT=`echo $[ ${#ARR[@]} / 2]`

for ((a=0; a < LIMIT ; a++)); do

        V1=${ARR[$VAR]}

        let "VAR+=1"

        V2=${ARR[$VAR]}

        echo "mounte $V1 nach $V2"

        let "VAR+=1"

done
```

fällt dir dazu was besseres ein?

(solved -> version 0.2.9 function check_mount)

um das md5 einer datei zu kennen brauchst du dann übrigens noch den namen vom paket (kriegst mit qpkg --find-pattern und dann kannst du das mit --md5-check überprüfen lassen ... allerdings find ich das nicht so sinnvoll, das macht portage schon.

ist das file korrupt wirds sowieso mit dem dist_overlay script wieder geholt  :Wink: 

auto_umount wird auch nicht ganz einfach, das script weiss ja nicht wann portage nicht mehr danach sucht bzw. benötigt ... oder seh ich das falsch?

tja .. komplex is das alles schon  :Wink: 

ich hab ein ~200 zeilen bash script gebastelt um grundlegend ein programm starten und beenden zu können ... o_O

----------

## sarahb523

hmm fein is das nich, aber es könnte gehen. naja das is aber auch nich so wichtig. das auto_umount ist nur mit dist_copy=1 sinnvoll. Die quelle könnte hier ein nfs server im lan sein, der für alle die pakete archiviert. Falls dann doch mal was benötigt wird kann eine workstation sich die vermissten files wieder holen. Aber ka. ob das so sinn macht.

Viel interressanter würde ich DIST_DEEPSCAN finden. Denn es wäre durchaus praktisch wenn auch die subdirs eines distdirs auch mit durchsucht werden. besonders bei der DVD verwendung (mit multisession gebrannt) ist das ideal, da ich mir meine Pakete in ordnern ablegen kann ... wenn du lust hast...  :Wink: 

----------

## equinox0r

sooooodele  :Wink: 

also ich hab gebastelt (aber nicht getestet, hab daheim kein funktionierendes internet) ...

neue version mit DIST_DEEPSCAN, ich hoffe mal ich hab das so einigermaßen hinbekommen wie du dir das vorgestellt hast ... 

achtung: function scan hat sich ziemlich verändert !

EDIT: noch ein kleines bugfix in DIST_FETCH und etwas weiter kommentiert ...

<caps-lock>CODE RAUSGENOMMEN</caps-lock>

was meinste?  :Wink: 

übrigens: wenn man mehrere mirrors in seine mirrorlist eingetragen hat und wie ich gerade internetlos ist, wird (bei mir) 3mal versucht die datei von einem der server zu laden und natürlich auch 3mal dist_overlay aufgerufen.. etwas unpraktisch ... sollte man das am besten über das log lösen?

----------

## sarahb523

ich habe es mal getestet und ein paar bugs behoben. (code siehe oben)

das -O .... in DIST_FETCH ist buggy, deshalb habe ich es direkt unten beim aufruf des fetch kommandos eingebaut. Das if mit dem find hat auch nich ganz so gefunzt, jetzt sollte es gehen

----------

## sarahb523

das source make.conf nach oben zu ziehen war keine gute idee, da dadurch die optionen des scripts eine höhere priorität erhalten. dies ist aber nachteilig, da es schon eine schöne sache ist die optionen global in der make.conf festzulegen. 

code ist geändert worden...

----------

## equinox0r

*jubel*

wieder internet daheim  :Smile: 

hier mal übrigens die ausgabe von dist_overlay:

```
[01:10:54] [root@dude.zion]

[~] $ emerge net-misc/whois

Calculating dependencies ...done!

>>> emerge (1 of 1) net-misc/whois-4.6.6-r3 to /

>>> Downloading http://gentoo.osuosl.org/distfiles/whois_4.6.6.tar.gz

   DISToverlay

 * WARNING  Performing DEEPSCAN. This may take a while

 * searching for whois_4.6.6.tar.gz

    scanning /data/mp3 (DEEPSCAN) file not found

    scanning /mnt/dvd (DEEPSCAN) file not found

    scanning /mnt/burn (DEEPSCAN) file not found

    scanning /mnt/dist (DEEPSCAN) file found

 * creating symlink from file to distfiles

Now starting merge...

....
```

funzt doch prima  :Smile: 

----------

## sarahb523

ich hab noch eine verbose option hinzugefügt. Jetzt fehlt nur noch eine schöne formatierung des verbose textes.

Auf meiner Wunschliste ist jetzt noch ein kleiner check ob die gefundene datei ein link ist. Wenn das nen link ist, dann sollte der neu anzulegende link nicht auf den gefundenen, sondern auf sein ziel zeigen. Wenn der link ungültig ist, soll weitergesucht werden.

@equinox0r

kannst du auch mal deine version abgleichen und posten? Denn ich denke da is was unterschiedlich... (hab ich anhand deiner ausgaben gesehen)

----------

## equinox0r

soooo.. schaust du mal hier  :Smile: 

mein vollständiges komplettes aktuelles dist_overlay mit check_mount  :Smile: 

EDIT: code ist richtig und funzt, bla  :Smile: 

EDIT #2: volltrunkenerweise noch nen bug entdeckt und gefixed *hrhr* (3:13 uhr mez)

buggy: fstab_out=`cat /etc/fstab | awk '{print $2}' | grep -v "^#" | grep -v "^/$"`

fix: fstab_out=`cat /etc/fstab | grep -v "^#" | awk '{print $2}' | grep -v "^/$"`

EDIT #3 (Mo Sep 20 22:04:55 CEST 2004) neue version online (0.3)

----------

## sarahb523

he das sieht ja richtig toll aus. Kannst du DIST_COPY="0" mal durch  DIST_COPY=false (und die entsprechende if zeile)  ändern? Ich hatte das in meiner vorigen Version schon getan. 

Jetzt fehlen eigentlich nur noch 2 cmd zeilen params zur vollständigkeit: 

--help

--version

wenn jemand lust und zeit hat... ansonsten mach ich das am kommenden Montag

----------

## equinox0r

dist_overlay 0.3 released!

neues feature: ignore_mount_fail und etwas code umgeschrieben .. kommentiert wird später  :Wink: 

hier der code:

```
mittlerweile hab ich v.0.3.1 released ... s.u.
```

und hier noch etwas output:

```
[21:44:27] [root@dude.zion]

[~] $ emerge net-misc/whois

Calculating dependencies ...done! \ 

>>> emerge (1 of 1) net-misc/whois-4.6.6-r3 to /

>>> Downloading http://gentoo.osuosl.org/distfiles/whois_4.6.6.tar.gz

   DISToverlay

 * WARNING Performing DEEPSCAN. This may take some time on large filesystems...

 * searching for whois_4.6.6.tar.gz...

    scanning /data/mp3 ... file not found.

 * /mnt/dvd is not mounted in filesystem. Trying to mount ...

 * /mnt/dvd could not be mounted.

    scanning /mnt/dvd ... file not found.

 * /mnt/burn is not mounted in filesystem. Trying to mount ...

 * /mnt/burn could not be mounted.

    scanning /mnt/burn ... file not found.

    scanning /mnt/dist ... file found!

 *  make a link from file to distfiles

....
```

.. und mit IGNORE_MOUNT_FAIL=false .. :

```
[21:52:27] [root@dude.zion]

[~] $ emerge net-misc/whois

Calculating dependencies ...done! \ 

>>> emerge (1 of 1) net-misc/whois-4.6.6-r3 to /

>>> Downloading http://gentoo.osuosl.org/distfiles/whois_4.6.6.tar.gz

   DISToverlay

 * WARNING Performing DEEPSCAN. This may take some time on large filesystems...

 * searching for whois_4.6.6.tar.gz...

    scanning /data/mp3 ... file not found.

 * /mnt/dvd is not mounted in filesystem. Trying to mount ...

 * /mnt/dvd could not be mounted.

 * Exiting from previous errors (IGNORE_MOUNT_FAIL)

 * Requested file is not in distfiles overlay.

 * Fetching file from original URI

   http://gentoo.osuosl.org/distfiles/whois_4.6.6.tar.gz

....
```

sowie auszugsweise meine /etc/make.conf:

```
DISTDIRS="/data/mp3:/mnt/dvd:/mnt/burn:/mnt/dist"

#FETCHCOMMAND='/usr/bin/wget --waitretry=5 -O ${DISTDIR}/${FILE} ${URI}'

FETCHCOMMAND='/usr/local/bin/dist_overlay.sh --search ${URI}'

DIST_FETCH="/usr/bin/wget -t 1 --waitretry=5 --passive-ftp -O ${DISTDIR}/${FILE} ${URI}"

DIST_CHECK_MOUNT=true

DIST_DEEPSCAN=true
```

lecker oder?  :Wink: 

allerdings gefällt mir 

```
# download distfile

function download_distfile {

   file_uri="$1"

   file_name="$2"

   ${DIST_FETCH} -O ${DISTDIR}/$file_name $file_uri

}
```

 nicht so ganz denn eigentlich gehört das nach oben in die einstellungen, ist aber ohne $file_uri nicht möglich .. any ideas? (nicht nur sarahb *g*)

----------

## equinox0r

*argl* .. ich hab zuviel zeit und nix zu tun  :Wink: 

noch eine neue version draussen ... dist_overlay 0.3.1 released (und nebenbei bin ich auch noch Guru geworden)  :Very Happy: 

clean mode wurde etwas verbessert....

EDIT (Di Sep 21 23:17:43 CEST 2004):

 - Codeoptimierung function download_distfile

 - Release final version 0.3.2

EDIT (Sa Jan 04:45:22 CEST 2005):

 - Neues Release 0.3.3

 - several bugfixes

aktuelle Version herunterladen

http://lichtspiele.org/~equinox/dist_overlay/

und natürlich etwas ausgabe  :Smile: 

```
[04:01:13] [root@dude.zion]

[~] $ dist_overlay.sh --clean

   DISToverlay

   Cleaning up dead links in /usr/portage/distfiles...

 * Deleting symlink whois... Sure? (y|n) y

 * Deleting symlink whoisficken... Sure? (y|n) y

Nothing left to do; exiting.
```

@sarah und alle die sich ältere versionen aufgehoben haben ...

könnt ihr mir was ihr noch habt bitte schicken? ich hab nicht mehr alle (vor allem deine init version sarah) und wollte das mal alles gesammelt online stellen .. merci  :Smile: 

----------

## sarahb523

he das script wird ja immer genialer. Alte versionen (bis auf die die ich hier gepostet habe) hab ich leider nicht. Dien ursprungsversion läßt sich sicher herstellen.

die aktuelle version hat aber noch einen kleinen schönheitsfehler. Wenn deltup verwendet wird, wird dem deltup script auch die wget option -O mitgegeben. dieses führt natürlich zu einem fehler. Ich habe bei mir die option herrausgenommen. Wozu brauchen wir die überhaupt? das deltup script benutzt die option intern auch nicht (von dort hab ich übrigends die wget zeile)

----------

## equinox0r

von mir aus kann das auch -O auch wieder raus, allerdings weiss ich nicht, ob das distfile dann auch wirklich nach $DISTDIR heruntergeladen wird... müsste ich ma ausprobieren  :Wink: 

oder die andere möglichkeit dass DIST_FETCH in der make.conf stehen muss, dann haben wir keine probleme mehr  :Twisted Evil: 

mein lieblingsfähnrich (harry kim) hat übrigens mal gesagt dass ein gutes programm nicht durch zu viele parameter verschlechtert werden sollte ... in diesem zusammenhang würde ich dann gerne die final releasen wollen, ausserdem wäre ein eintrag in https://forums.gentoo.org/viewtopic.php?t=67849 bestimmt sinnvoll ... die ehre überlass ich dir sarah, ist schliesslich "dein" script  :Wink: 

----------

## equinox0r

sooodele  :Smile: 

mal was neues von hier:

Zu finden gibt es das Script künftig 2mal hier im Forum:

https://forums.gentoo.org/viewtopic.php?p=1561711

https://forums.gentoo.org/viewtopic.php?t=67849

und unter:

http://www.lichtspiele.org/~equinox/dist_overlay

wir hoffen dass das jemand von euch noch benutzt  :Wink: 

----------

## Rawk

Vielen Dank für das nette Script.  :Smile: 

Zwei Dinge sind mir aufgefallen:

- in DISTDIRS muss ein : stehen, auch wenn nur ein Verzeichnis eingetragen ist.

- in DIST_FETCH mit wget sollte man "-P ${DISTDIR}" ergänzen, damit die Datei auch im richtigen Ordner landet. Hatte mich erst gewundert warum, die Datei immer wieder runtergeladen wird, bis ich gemerkt hab, dass sie im aktuellen Verzeichnis gelandet ist.  :Wink: 

----------

## Rawk

```
if  ${DIST_COPY} ; then 
```

lief bei mir nicht; habs dann mal in 

```
if [ ${DIST_COPY} ]; then
```

 geändert und 

```
DIST_COPY=true
```

 gesetzt.

Außerdem funktioniert deepscan nicht, da beim Aufruf von get_distfile $NEW_FILE und $DIR übergeben werden und $DIR einen Pfad aus $DISTDIRS enthält ohne den/die Unterordner. Ich hab mich dann mal versucht (obwohl ich (bisher) keine Ahnung vom shell scripting hab  :Wink: ) und das ist dabei herausgekommen:

```
 

# DIST_DEEPSCAN for searching in subdirectories 

       if ( ${DIST_DEEPSCAN} ); then 

          DIST_FIND_RESULT=`find "$DIR" ${DIST_DEEPSCAN_OPTS} -name "$NEW_FILE"` 

        if [ -n "$DIST_FIND_RESULT"  ]; then 

           LENGTH1=`expr length "$DIST_FIND_RESULT"`

           LENGTH2=`expr length "$NEW_FILE"`

           LENGTH=`expr $LENGTH1 - $LENGTH2`

           LENGTH=`expr $LENGTH - 1`

           DIR=`echo $DIST_FIND_RESULT | cut -c -$LENGTH`

           get_distfile $NEW_FILE $DIR 

        fi

```

Ist vielleicht nicht die beste Möglichkeit, aber es funktioniert.  :Wink: 

----------

## equinox0r

hallöle .. mal wieder was neues: 

release v. 0.3.3

+echo $DISTDIRS | grep : > /dev/null || break

in function scan

--info parameter hinzugefügt

raus aus der endlosschleife wenn DISTDIRS kein : im string hat.

@Rawk: den von dir beschriebenen Fehler hab ich nur teilweise feststellen können.

die variablen $NEW_FILE und $DIR sind durchaus richtig gesetzt, in $NEW_FILE steht der dateiname der gefundenen datei, in $DIR das verzeichnis zur datei.

allerdings hattest du recht:

```
if [ ${DIST_COPY} ]; then
```

muss richtig sein, danke dafür, hab ich gleich mitgefixed für das neue release.  :Smile: 

die jew. aktuelle version findet ihr übrigens unter http://lichtspiele.org/~equinox/dist_overlay

bis denn  :Smile: 

ps: sarah, wenn du das hier mal lesen solltest: nimmst du bitte auch deine alten codeschnipsel raus (falls vorhanden) und anstelle davon nen verweis auf die url. thx  :Smile: 

----------

## d4rkn0va

Ich versteh selbst nicht ganz wieso, aber auf jeden Fall kopiert das Script bei mir trotz DIST_COPY=false jede der gefundenen Dateien aus den anderen Verzeichnissen nach /usr/portage/distfiles.

Vll hat ja jemand noch diesen Fehler, bin irgendwie langsam am verzweifeln was ich noch machn koennte.

Nachtrag:

Die kritische Stelle sollte jawohl diese hier sein, scheint mir aber alles in Ordnung, trotzdem krieg ich das Mistding echt nicht zum linken! 

```
   if [ ${DIST_COPY} ]; then

      write_log "(COPY) $1 ($DISTDIR)"

      echo -e "${GREEN} * ${NORMAL} copy file to distfiles\n\n"

      cp $2/$1 $DISTDIR

   else

      write_log "(SYMLINK) $1 ($DISTDIR -> $2)"

      echo -e "${GREEN} * ${NORMAL} make a link from distfiles to file\n\n"

      ln -sf $2/$1 $DISTDIR/$1

   fi

```

Nachtrag 2:

Selbst wenn ich das Script dazu zwinge, mir nen link zu machen statt die Datei zu kopieren, bricht mir mein emerge mit einem Fehler bei einem chown aufgrund read-only ab, da die gelinkte Datei bei mir auf DVD liegt.

Manuelles chown :portage funktioniert aber.

Sind das alles Fehler meinerseits oder sind diese Fehler sonst auch bekannt?

----------

## Rawk

Es muss wohl 

```
if ( ${DIST_COPY} ); then
```

 sein...

Das mit dem read-only ist bei mir auch aufgetreten (nfs). Wenn man dann nochmal emerge xyz macht gehts. Aber soweit ich das beurteilen kann liegt das an Portage und nicht an dem Script...

----------

## Pette

Hallo.

Ich bin hellauf begeistert von diesem tollen Skript!

Hab dennoch 2 Fragen/Anmerkungen:

1) Mein eines Dist_Overlay Verzeichnis wird per NFS von meinem Desktop-PC auf meinen Laptop gemountet. Wenn ich nun mit dem Laptop an der Uni bin und dort "emerge -uf" ausführe, versucht er natürlich auch dieses Verzeichnis zu mounten. Und das kann mit unter Minuten dauern, bis er gerafft hat, dass das Verzeichnis nicht gemountet werden kann.

Kann man den mount-Prozess irgendwie beschleunigen? Gibts da nicht ne Art "timout" Funktion?

Wäre cool.

2) Wenn er eine Datei auf dem Desktop zuhause gefunden hat, macht er einen Link dorthin. Wunderbar. Jedoch bricht das Skript sofort danach mit Fehler-Meldungen ab. Ich glaube diese Fehlermeldungen stehen in Zusammenhang mit dem getdelta-Skript. Bin mir aber nicht sicher.

Ich werde die Fehlermeldung nachreichen, sobald ich zuhause bin.

Greetz,

Pette

----------

## d4rkn0va

Also, das mit dem Read-Only-Fehler ist garantiert ein "Fehler" in Portage, allerdings gibts da sicher auch nen Fix dafür, egal wie dirty er ist..

Morgen rüst ich hier 60 Rechner auf gentoo um, spätestens dann brauch ich das Script, hat irgendwer noch Vorschläge?

----------

## Pette

Hab gerade diesen Thread entdeckt:

HOWTO:Download Cache for your LAN-Http-Replicator (ver 3.0)

Hab mich noch nicht wirklich näher damit befasst, aber ist das nicht sowas in der Art wie DistOverlay?

Hat das hier schon jemand ausprobiert?

Greetz,

Pette

----------

