Sie sind nicht angemeldet.

DeaD_EyE

Administrator

  • »DeaD_EyE« ist der Autor dieses Themas

Beiträge: 3 980

Wohnort: Hagen

Beruf: Mechatroniker (didaktische Systeme)

Rootserver vorhanden: Nein

  • Nachricht senden

1

Montag, 21. April 2008, 22:52

[LINUX] Maps vom Server extrahieren

Problemstellung: Ich habe einen riesigen Mappool und möchte gerne jemanden eine Map geben oder zum Download anbieten. Solange nur die .bsp Datei benötigt wird, ist das ganze recht simpel. Sobald man aber noch viele dazugehörige Customfiles hat, sollten die auch in das Archiv. Man müsste sich mühsam aus der .res-Datei die einzelnen Dateien zusammensuchen. Mein Script liest die .res-Datei aus, falls vorhanden und kopiert die entsprechenden Dateien.

Was das Script nicht kann: Leider ist es so, dass sehr viele Fehlerhafte .res Dateien im Umlauf sind. Das Script beachtet die Groß- und Kleinschreibung. Unterscheiden sich die Dateien von der Schreibweise, werden sie nicht kopiert. Ich habe bis jetzt noch keinen sinnvollen Weg gefunden, dies zu beheben.

Was das Script macht: Es kopiert die Dateien in das angegebene Verzeichnis (extract_dir | bzw. SINGLE_MAP_DIR im Script selber) und Pakt sie mit gzip, bzip2, zip oder 7z. Die nötigen Dateien werden aus der .res Datei zusammengesucht. Fehlt sie, wird dieser Teil übersprungen. Zusätzlich wird noch versucht die Datei mapname.nav und mapname.txt mit einzubeziehen.

Verwendung: Aufgerufen wird das Script mit

Quellcode

1
./extract_map.sh mappool_verzeichnis verzeichnis_für_map mapname
Wenn nur ein Parameter angeben wird, wird dieser als Mapname verwendet. Das Verzeichnis MAPPOOL (Modverzeichnis oder gemeinsamer Mappool) und SINGLE_MAP_DIR (Verzeichnis in das die Map kopiert wird) wird dann aus dem Script selber verwendet. Die beiden Werte der Variablen sollten dann vorher Script abgeändert werden. Die Variable archiver_format gibt an, womit die Dateien komprimiert werden. Folgende Formate sind möglich: gzip, bzip2, zip, 7z. Bei jeder Distribution sollte gzip und tar vorhanden sein. Bzip2, zip und 7z müssen meistens installiert werden. Meistens ist es am einfachsten das über den Paketmanager von der jeweiligen Distribution zu erledigen.

Beispiel1:

Quellcode

1
./extract_map.sh ~/server1/cstrike/ ~/mapdownload de_tune_down


Beispiel2:

Quellcode

1
./extract_map.sh de_tune_down


Programmcode:

extract_map.sh

#!/bin/bash
MAPNAME=""
MAPPOOL=/home/server/mappool/hl2/cstrike
SINGLE_MAP_DIR=/home/server/single_map

#supported formats= gz, bz2, zip, 7z
archiver_format=gz

function copy_map {
mkdir -p $SINGLE_MAP_DIR/$MAPNAME/maps
cp $MAPPOOL/maps/$MAPNAME.bsp $SINGLE_MAP_DIR/$MAPNAME/maps/
}

function copy_extra_files {
if [ -f $MAPPOOL/maps/$MAPNAME.res ]; then
#HACK FOR WHITESPACES
oldifs=$IFS
IFS="
"
for file in $(cat $MAPPOOL/maps/$MAPNAME.res | awk -F'"' '{ print $2 }' | grep -v 'resources' | sed -e '/^[ ]*$/d'); do
if [ -f $MAPPOOL/$file ]; then
filedir=`dirname $file`
if [ ! -d $SINGLE_MAP_DIR/$MAPNAME/$filedir ]; then
mkdir -p $SINGLE_MAP_DIR/$MAPNAME/$filedir
fi
cp -u $MAPPOOL/$file $SINGLE_MAP_DIR/$MAPNAME/$file
fi
done
IFS=$oldifs
cp -u $MAPPOOL/maps/$MAPNAME.res $SINGLE_MAP_DIR/$MAPNAME/maps/
fi
}

function copy_nav_txt {
if [ -f $MAPPOOL/maps/$MAPNAME.nav ]; then cp -u $MAPPOOL/maps/$MAPNAME.nav $SINGLE_MAP_DIR/$MAPNAME/maps/; fi
if [ -f $MAPPOOL/maps/$MAPNAME.txt ]; then cp -u $MAPPOOL/maps/$MAPNAME.nav $SINGLE_MAP_DIR/$MAPNAME/maps/; fi
}

function create_gz {
if [ -z `which tar` ]; then echo "Sorry, didn't find tar" && exit 1; fi
if [ -z `which gzip` ]; then echo "Sorry, didn't find gzip" && exit 1; fi
cd $SINGLE_MAP_DIR
tar -cvzf $SINGLE_MAP_DIR/${MAPNAME}.tar.gz $MAPNAME
rm -R $SINGLE_MAP_DIR/$MAPNAME
}

function create_bz2 {
if [ -z `which tar` ]; then echo "Sorry, didn't find tar" && exit 1; fi
if [ -z `which bzip2` ]; then echo "Sorry, didn't find bzip2" && exit 1; fi
cd $SINGLE_MAP_DIR
tar -cvjf $SINGLE_MAP_DIR/${MAPNAME}.tar.bz2 $MAPNAME
rm -R $SINGLE_MAP_DIR/$MAPNAME
}

function create_zip {
if [ -z `which zip` ]; then echo "Sorry, didn't find zip" && exit 1; fi
cd $SINGLE_MAP_DIR
zip -r9 $MAPNAME $MAPNAME
rm -R $SINGLE_MAP_DIR/$MAPNAME
}

function create_7z {
if [ -z `which 7z` ]; then echo "Sorry, didn't find 7z" && exit 1; fi
cd $SINGLE_MAP_DIR
7z a -r $MAPNAME $MAPNAME
rm -R $SINGLE_MAP_DIR/$MAPNAME
}

if [ $# -eq 3 ]; then
MAPPOOL=$1
SINGLE_MAP_DIR=$2
MAPNAME=$3
if [ ! -d $MAPPOOL ]; then echo "Wrong Mappool dir: $MAPPOOL" && exit 1; fi
ls $MAPPOOL/maps/*.bsp >/dev/null 2>/dev/null || echo "Wrong Mappool dir: $MAPPOOL" || exit 1
if [ ! -d $SINGLE_MAP_DIR ]; then echo "Please create a directory for map extracting. Given Value: $SINGLE_MAP_DIR" && exit 1; fi
if [ ! -f $MAPPOOL/maps/${MAPNAME}.bsp ]; then echo "Sorry, the given map $MAPNAME doesn't exist" && exit 1; fi
copy_map
copy_extra_files
copy_nav_txt
fi

if [ $# -eq 1 ]; then
MAPNAME=$1
if [ ! -f $MAPPOOL/maps/${MAPNAME}.bsp ]; then echo "Sorry, the given map $MAPNAME doesn't exist" && exit 1; fi
echo "Only the mapname is given. Using following preseted values -> mappool: $MAPPOOL | extract_dir: $SINGLE_MAP_DIR"
copy_map
copy_extra_files
copy_nav_txt
fi

if [ $# -eq 0 ]; then echo -e "$0 mappol_dir extract_dir mapname\n or\n$0 mapname" && exit 1; fi

if [ "$archiver_format" = "gz" ]; then create_gz
elif [ "$archiver_format" = "bz2" ]; then create_bz2
elif [ "$archiver_format" = "zip" ]; then create_zip
elif [ "$archiver_format" = "7z" ]; then create_7z; fi
exit 0

2

Montag, 21. April 2008, 23:27

Re: [LINUX] Maps vom Server extrahieren

mh geniale idee...
hättest es nur ein paar tage früher posten müssen, hatte nämlich gerade erst mit einem riesigenmapool zu tun aus dem ich sämtliche dateien per hand rausgesucht hab :P

aber respekt, scheint ein geiles script zu sein
(saug...)