# Debian Script ab einem bestimmten Abschnitt weitermachen



## schlawiner (22. September 2010)

Hallo Freunde,

Ich versuche gerade mit eine if then Anweisung einen Sprung hinzulegen.

nach dem motto passt das dann übersringe alle und springe zu punkt 2

sprich mein startscript soll aus den gameserver parametern $* erlesen was für ein game das ist und an die dafür vorgesehene stelle im script springen und da weitermachen. jemand eine Idee?

nehmen wir z.b
./css_run -game cstrike +map gsmap -maxplayers gsplayer -ip gsip -port gsport +exec fastdl.cfg gsport +sv_password gspasswd -tickrate gstick +fps_max 500 set tv_maxclients 10

da könnte man cstrike als Merkmal aus den startparametern nehmen.


----------



## Ronox (23. September 2010)

Hi, ich hoffe du meinst:



> #!/bin/sh
> 
> 
> if [ $1 = css ]
> ...



Das Script nennst du dann so wie du willst 
Erweiterst es nach belieben. 
mit 


> chmod u+x $scriptname


kannst du dann das Script ausführbar machen.

und z.B. den CSS Server starten:


> ./$scriptname css



Ich hoffe das Bringt dich weiter.

MFG Ronox


----------



## schlawiner (23. September 2010)

Das script soll irgendwann für alle games dienen welche ich habe

vom Prinzip her soll es das Game erkennen welches gestartet wird

so stelle ich mir das vor

(IF Anweisungen)
#Call Of Duty
wenn cod_lnxded in den parametern gefunden so springe zu Abschnitt 1 und mach da weiter
#Call Of Duty 2
wenn cod2_lnxded in den parametern gefunden so springe zu Abschnitt 2 und mach da weiter
#Call Of Duty 4
wenn cod4_lnxded in den parametern gefunden so springe zu Abschnitt 3 und mach da weiter
#Call Of Duty 5
wenn codwaw_lnxded in den parametern gefunden so springe zu Abschnitt 4 und mach da weiter
#Call Of Duty UO
wenn coduo_lnxded in den parametern gefunden so springe zu Abschnitt 5 und mach da weiter
#Counter Strike Source
wenn "srcds_run -game cstrike" in den parametern gefunden so springe zu Abschnitt 6 und mach da weiter

usw.

gestartet soll das script dan später so werden z.b.

./gs_run ./srcds_run +parameter


----------



## Ronox (23. September 2010)

Wieso willst du dir das so Komliziert machen?

wieso nicht deine Server so starten:

./startserver cod2

und in dem Script wie oben, von mir gepostet, trägst du dann deine kompletten Parameter ein, oder wenn du z.B. Port Zahl usw. haben willst, dann setzt du dort noch weitere Parameter ran?

So hast du ein Script für alles, das doch viel besser, weil so wie du das willst oder was du willst das versteh ich nicht so ganz.

MFG Ronox


----------



## Bratkartoffel (23. September 2010)

Hi,



schlawiner hat gesagt.:


> [...]
> so stelle ich mir das vor
> 
> (IF Anweisungen)
> ...


 
Nach deiner Beschreibung sieht das so aus:


```
#!/bin/bash

ACTION=${1}

if [[ -z "${ACTION}" ]]; then
  echo "No action given." >&2
  exit 1
fi

function startCod() {

}

function startCod2() {

}

case "${ACTION}" in
  cod_lnxded)
    startCod
    ;;
  cod2_lnxded)
    startCod2
    ;;
  default)
    echo "Unknown action." >&2
    exit 2
    ;;
esac

exit 0
```

Natürlich musst du das Ganze noch um die Funktionen zum Starten der Server erweitern.

Gruß
BK


----------



## schlawiner (23. September 2010)

Das ist ganz einfach, das script soll verschiedene Sachen die Gamespezifisch sind dann noch bei den jeweiligen Games dann hintenansetzen.

wie z.b bei cod4 soll das script die fastdlparameter automatisch erkennen und hinten an setzen.
während es bei css nicht funktioniert und dafür dann eine config schreiben muss und diese laden muss.

Desweiteren möchte ich dann da eine Gameserverupdate funktion mit einbauen falls Steam wieder mal Probleme macht.


----------



## schlawiner (23. September 2010)

```
#!/bin/bash


#Gameserverip festlege.
gsip=`echo "$*" | grep  -Eo "[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}"`

#Gameserverpfad festlegen
fdpfad=$(pwd | awk -F/ '{ sub(/\/home/,""); print }');

#Fastdownload Url festlegen
url="$fastdl/$gsip$fdpfad"

#entgueltige Fastdownloadparameter COD Series
start="$* +set sv_allowdownload "\"1\"" +set sv_wwwDownload "\"1\"" +set sv_wwwBaseURL "\"$url\"" +set sv_wwwDlDisconnected "\"0\"""


ACTION=${1}

if [[ -z "${ACTION}" ]]; then
  echo "No action given." >&2
  exit 1
fi
 
function startCod() {
$start
 
}
 
function startCoduo() {
$start
 
}

function startCod2() {
$start
 
}

function startCod4() {
$start
 
}

function startCodwaw() {
$start
 
}

function startCss() {
        fdgame="/orangebox/cstrike"    
        echo //Automatisches Fastdownloadscript - wird bei jedem Serverstart erstellt  >> $cfgvar/fastdl.cfg
        echo //----------------------------------------------------------------------  >> $cfgvar/fastdl.cfg
        echo sv_downloadurl "\"$fastdl/$gsip$fdpfad$fdgame\""                      >> $cfgvar/fastdl.cfg
        $* +exec fastdl.cfg
 
}

function startCs16() {
 
}

function startDods() {
 
}

function startDod() {
 
}

function startCsz() {
 
}

function startTfii() {
 
}

function startL4d() {
 
}

function startL4d2() {
  
}


 
case "${ACTION}" in
  cod_lnxded)
    startCod
    ;;
  coduo_lnxded)
    startCoduo
    ;;
  cod2_lnxded)
    startCod2
    ;;
  cod4_lnxded)
    startCod4
    ;;
  codwaw_lnxded)
    startCodwaw
    ;;
  srcds_run -game cstrike)
    startCss
    ;;
  hlds_run -game cstrike)
    startCs16
    ;;
  srcds_run -game dod)
    startDods
    ;;
  hlds_run -game dod)
    startDod
    ;;
  hlds_run -game czero)
    startCsz
    ;;
  srcds_run -game tf)
    startTfii
    ;;
  srcds_run -game left4dead)
    startL4d
    ;;
  srcds_run -game left4dead2)
    startL4d2
    ;;
  default)
    echo "Kein Game Support." >&2
    exit 2
    ;;
esac
 
exit 0
```

so ok?


----------



## schlawiner (23. September 2010)

habs gerade getestet probleme gibts bei den HL spielen da die nur mit mehreren Variablen auseinander zu halten sind


----------



## schlawiner (24. September 2010)

Hehe ich darf glücklich sagen ich habe es hinbekommen,

nun habe ich nur noch ein problem welches es zu lösen gilt.

ich muss 3 Parameter aus einer anderen Datei ziehen, Sprich ich lege irgendwo eine textdatei ab in dieser befindet sich

updateserver
fastdlserver
Imageserver

Beste grüsse und vielen Dank


----------



## Bratkartoffel (24. September 2010)

Hallo,

den Inhalt einer Datei bekommst du so in eine Variable:

```
inhalt=$( cat DATEI.txt );
```

Gruß
BK


----------



## schlawiner (24. September 2010)

geht das ich wenn man die 3 Variablen in eine Datei schreibt, so das er sie als 3 versch. Varis ausließt


----------



## Bratkartoffel (27. September 2010)

Hallo,

deine "Problembeschreibung" ist echt top 
Naja, kommt drauf an, wie die getrennt sind. Am einfachsten ist es durch einen Tabulator oder durch ein Leerzeichen, aber auch ein Zeilenumbruch ist kein Problem.


```
alles=$( cat DATEI.txt )

for akt in $alles; do
  echo "Teil: $akt"
done
```

Gruß
BK


----------



## schlawiner (27. September 2010)

wäre es vieleicht auch einfacher das ich so eine Art Config erstelle und er z.B

mit 

cacheordner=home/cache

ausließt so das er das hinter dem = nimmt. Dann wäre man eventl nicht an Zeilen etc. gebunden gibts da ne Möglichkeit


----------



## Bratkartoffel (28. September 2010)

Hallo,

solange du die Config dann bash-konform hältst, kannst du die mit

```
. /pfad/zur/config
```
einlesen.

Gruß
BK


----------



## schlawiner (29. September 2010)

Hallo,

super funktioniert,

ich habe es aber nun so gelöst. Manchmal findet man Lösungen auch wenn man zufällig in ein altes Script reinschaut.

Bis jetzt ist ein geiles Gameserverstartscript entstanden. Es funktioniert tadelos. Ist für Alle HL Games und Games der COD Serie gedacht. Hier ein kurze Vorschau.

Das Script erledigt eine automatische Fastdl Zuweisung über die Startsequenz, eine Neuinstallfunktion der Gameserver, updates von Steam und Punkbuster (Hardupdate), startet bei cod den Manuadmin Mod 5 Sekunden nach Serverstart.

Nun geht mir noch eine Idee im Kopf rum:

Und zwar die automatische Anpassung der HLTV Config oder der Manu Admin Config:

Dazu muss das Script sich Daten aus der Server.cfg des Gameservers ziehen.

wie z.b.

Server.cfg

```
// Der Hostname bezeichnet deinen Servernamen
// Das rcon Password macht dich zum Admin auf deinen Server

hostname "CSS - Server"
rcon_password "topsecret"

// Mani Admin Plugin
//
// exec mani_server.cfg
// exec mani_quake_sounds.cfg


sv_password "test"



/////////////////////////////////////////////////////////////////////////
// Electronic Sports League
// CS:S Config 5on5 Ladder
// Version 4.0
// 27.01.2009

mp_allowspectators "1"
mp_autokick "0"
mp_autoteambalance "0"
mp_buytime "0.25"
mp_c4timer "35"
mp_chattime "5"
mp_decals "300"
mp_dynamicpricing "0"
mp_fadetoblack "0"
mp_flashlight "1"
mp_footsteps "1"
mp_forcecamera "1"
mp_freezetime "6"
```

Hier müsst sich das Script den Parameter 

sv_password "test"

hier müsste sich das Script das test nehmen und in einer anderen Config an einem bestimmten Punkt wieder einsetzen.

Sagen wir die Config lautet so:


ip=xxx.xxx.xxx.xxx
port=xxxxxx
password=test
servername=Hier bin Ich


Sprich die Parameter oben und muss er lassen und nur das rote abändern.


Beste Grüsse


----------



## Bratkartoffel (29. September 2010)

Hallo,

für das austauschen von Daten in einer Datei nehm ich bevorzugt sed her.
Der ist zwar etwas "umständlich" zu bedienen, aber schnell und kann so ziemlich alles was man braucht.

Zu deiner Problemstellung könntest du etwas wie folgt verwenden:

```
# Aus der Serverconfig etwas auslesen, hier "sv_password"
value=$( grep sv_password /pfad/zur/Server.cfg | sed -e 's/^[[:space:]]*sv_password[[:space:]]\+"\([^"]*\)"/\1/' )

# Schauen ob das Feld "password=" bereits in der Zielconfig vorhanden ist
grep password= /pfad/zur/Config &>/dev/null

if [[ $? -eq 0 ]]; then  # Vorhanden!
  sed -i /pfad/zur/Config -e "s/^\(password=\).*$/\1${value}/"
else  # Nicht vorhanden!
  echo "password=${value}" >/pfad/zur/Config
fi
```

Gruß
BK


----------



## schlawiner (30. September 2010)

funktioniert schon ganz gut das was allerdings leichte Probleme macht ist wenn er an den Punkt "logfile" kommt

wenn er da $log einsetzen soll

welches ../../mod/pfad enthalten gibts Probleme

sed -i /pfad/zur/Config -e "s/^\(password=\).*$/\1${value}/"


----------



## Bratkartoffel (30. September 2010)

Hallo,

dies liegt daran, dass in dem Wert Slashes vorkommen (Diese da: / ).
Somit musst du bei sed einen anderen Delimiter wählen, oder den String escapen.


```
sed -i /pfad/zur/Config -e "s|^\(log=\).*$|\1${log}|"
```

Gruß
BK


----------



## schlawiner (30. September 2010)

Irgendwo habe ich da nen Denkfehler


```
sed -i /home/$fdpfad/mods/manuadminmod/config/config.cfg -e "s/^\(logfile[[:space:]]=[[:space:]]\).*$|\1"\"${log}\""|"
```


----------



## Bratkartoffel (30. September 2010)

Joa,

du hast bei deinem sed-Befehl den Delimiter nicht überall geändert, es sollte wie folgt heißen:

```
sed -i /home/$fdpfad/mods/manuadminmod/config/config.cfg -e "s|^\(logfile[[:space:]]+=[[:space:]]+\).*$|\1${log}|"
```

Gruß
BK


----------



## schlawiner (30. September 2010)

Hmmm nö er mag mich ned, geht nicht


----------



## schlawiner (1. Oktober 2010)

hehe nu mag es ! Klasse

Einen Bug gibts noch

Wenn in der Server.cfg die Rcon Anweisung so steht:

//set sv_rconpassword "Ihr Admin Passwort"  --- Rcon Einstellungen
set rcon_password "topsecret"

kommt er durcheinander. Hat jemand eine Idee das er die Zeile nimmt die nicht auskommentiert ist.



```
rcon=$( grep set[[:space:]]rcon_password $home/$log1/server.cfg | sed -e 's/^[[:space:]]*set[[:space:]]rcon_password[[:space:]]\+"\([^"]*\)"/\1/' )
```


----------



## Bratkartoffel (1. Oktober 2010)

Jo sorry, die "+" müssen auch escaped werden 


```
sed -e "s|^\(logfile[[:space:]]\+=[[:space:]]\+\).*$|\1${log}|"
```

// Edit: Zu deinem neuen Beitrag:
Er sollte nicht durcheinander kommen, da du ja bei dem RegEx mit dem "^" nach dem Delimiter den Zeilenanfang markierst. Somit sollt er auf den Kommentar nicht zutreffen.
Ansonsten kannst ja noch den Modifier "g" (global) hinten an den RegEx dranhängen:

/suchen/ersetzen/*g*

// Edit2: Habs gerade getestet, er liefert das korrekte Ergenbis "topsecret" zurück, auch ohne den Modifier.

Gruß
BK


----------



## schlawiner (1. Oktober 2010)

Hi,

ja erstmal muss ich sagen, entschuldigen brauch sich keiner`g. So gut wie Du mir **** geholfen hast kann ich nur auf die Füsse fallen`g.

Mal vielen Dank.


Eigentlich hab ich alles was ich brauche und es ****t nun alles. Eine Idee die ich mir überlege ein zu bauen wäre ein Limit für die Neuinstalls.

Die Überlegung ist dies Anhand von logfiles zu erledigen. Sprich ich gebe dem ichs etze eine Vari 2 in der Config so hat er 2 Neuinstalls in einem Monat zur Verfügung.


----------

