# Aktive Server Rollenspiele - Downloadmanager



## zkmlch (10. Oktober 2011)

Hallo liebe (noch) Freunde 

Noch, desswegen weil Ich nun ein Problem vorstellen möchte welches für mich ein ganz schweres & heisses Eisen darstellt.Ich denke das eine genaue Lösung meines Problems vielen Leuten im Netz helfen wird, den Ich habe diesbezüglich nichtmal Ansatzweise was in der Google-Welt gefunden.

Ich schildere euch kurz mein Projekt:

In zwei weiteren Treads habe Ich bereits kleinere Probleme ansatzweise lösen können. Es geht darum einen Downloadmanager zu erstellen.

Meine Netzwerkinfrastruktur:

masterwebserver222
192.168.4.222
Debian 6.0

slavewebserver223
192.168.4.223
Debian 6.0

slavewebserver224
192.168.4.224
Debian 6.0

slavewebserver225
192.168.4.225
Debian 6.0

slavewebserver226
192.168.4.226
Debian 6.0

Bereits realisierte Module:

Admin Interface mit voll funktionsfähigem CRUD
MD5 Filechecking (Prüft auf Duplikate)
Servercheck

Der Masterserver übernimmt folgende Aufgaben:

Mirrorverteilung auf alle Slaveserver inkl MySQL DB Backup
Alle Downloads egal von welchem server laufen über 192.168.4.222


Folgende Punkte müssen im nächten und letzten Modul erfüllt werden:

--> Falls der Masterserver aussteigt soll man per E-Mail benachrichtigt werden und es soll automatisch ein neuer Master gewählt werden. Zusätzlich soll bei Wartungsarbeiten an einem Server manuell im Admin Interface ein neuer Server bestimmt werden können.

--> Jeder Server kann temporär die Rolle des Masters übernehmen und andere Slave Server mit seinen neusten Daten versorgen.

--> Greift zum Beispiel Admin 1 auf das Adminpanel des slaveserver224 zu und verändert einige Dateien und fügt einen oder mehrere Datensätze der Datenbank hinzu, so erhält dieser Server automatisch die masterrolle und ist für die verteilung der Mirrors zuständig.

--> Greift Admin 1 auf den slaveserver224 zu und wärend desssen möchte Admin 2 noch auf dem slaveserver226 einige änderungen machen so soll dem Admin 2 der Zugriff verwehr werden!

--> Jeden Sonntag soll der Master automatisch mittels Cronjob seine Daten an die anderen Salves verteilen. dabei soll jeder der Server zuerst anhand seiner IP in der Datenbank nachschauen ob er Master ist, falls nicht soll er nichts machen.


Wer weitere Informationen benötigt dem wird gerne Stoff geliefert... Ich wollte nicht zuviel schreiben da es sonst schon recht kompliziert ist.

Wer mir zur Lösung dieses harten Brockens weiterhelfen kann wird mit Taschengeld belohnt... den dann hab Ichs geschaft!


Gruss Patrick


----------



## saftmeister (10. Oktober 2011)

Nunja, her mit dem Taschengeld ;-)

Das Konzept ist nicht neu, nennt sich Load-Balancing.


----------



## zkmlch (10. Oktober 2011)

Hi saftmeister

Über diesen Artikel bin Ich nocht nicht gestolpert jedoch liegt mir der Begriff eines Load-Balancer eher im sinne einer Last-Verteilung... Bei meinem "konzept" möchte Ich keine Last verteilen, sondern sexy Rollenspiele machen 

Gruss Patrick


----------



## zkmlch (11. Oktober 2011)

Edit: Ich wollte noch sagen das ich NOCH nicht aud der suche nach Codeschnipseln bin sondern erstmal die notwendingen "Module" suche...


Was brauche ich für Scripts
Wie kann Ich das realisieren
Was brauch ich für Hard/Software Anforderungen

Hat jemand damit schon Erfahrung gemacht oder mal was ähnliches Konzipiert oder gar umgesetzt?

Besten Dank und Gruss Patrick


----------



## saftmeister (11. Oktober 2011)

Ich würde den MySQL-Kram nicht über Backup sondern über Replikation lösen. Dafür wurde sie "erfunden".

Die Sache mit der Email-Meldung bei Server-Crash ist so ne Sache. Ist der Server komplett hinüber, kann er auch keine Email mehr senden. Du bräuchtest also einen Art Monitor-Server, der alle Server-Instanzen überwacht und ggf. entsprechend reagiert.

Was kennzeichnet den Masterserver in deinem Kontext? Was macht einen Server zu einem Master-Server?

Grundsätzlich kann man diese Art von Failover auch über DNS-Round-Robin implementieren - aber nur, wenn das über den Domain-Namen laufen soll.


----------



## zkmlch (11. Oktober 2011)

Hi Saftmeister!

Replikation der MySQL Datenbank mit Master und Slave Rollen fällt definitiv aus....

Zu deiner Aussage: 





> Dafür wurde sie "erfunden".



;-) Ich hab Sie jedenfalls nicht erfunden, ist bestimmt ein nettes Spielzeug aber für mein System nicht gebräuchlich. Ich erläutere dir dies, Anhand eines Fallbeispieles:

Fall Datenbankfehler:

Sollte aus irgendeinem Grunde ein Datenbankfehler auftreten oder ein Admin macht versehentlich falsche DB-Einträge so sind diese Fehler automatisch auf allen Servern vorhanden. Dies wäre der Super-Gau... Alle 5 Webseiten, die eigentlich Redundaz für den Besucher bieten sollen, fallen auf einmal aus. Ich bleibe somit bei meiner Lösung mit dem MySQL Dump und INSERT INTO....

Gruss Patrick


----------



## saftmeister (11. Oktober 2011)

Ich sehe, du hast den Sinn und Zweck einer Replikation nicht verstanden. Aber gut...


----------



## zkmlch (12. Oktober 2011)

Dann klär mich doch auf... Habe zwar das Kapitel in der MySQL Referenz durchgelesen aber Ich wüsste nicht was an meiner Aussage falsch ist....


----------



## saftmeister (12. Oktober 2011)

Selbstverständlich kann man mittels MySQL-Dump die Datenbank kopieren. Bei wenigen Einträgen wird das gut funktionieren. Aber: Ein inkrementeller Update ist darüber nicht so ohne weiteres möglich. Das bedeutet, das immer die komplette DB gedumpt und eingespielt werden muss.

Replikation kann man so einrichten, dass sie nicht permanent läuft, sondern sich bspw. um eine bestimmte Uhrzeit alle Slaves zum Master connecten, die Deltas synchronisieren und anschließend wieder disconnecten. Wenn du das Manual tatsächlich gelesen hättest und nicht nur überflogen, wärst du evtl. selbst auf die Idee gekommen 

Das SQL dafür lautet nur so nebenbei: START SLAVE bzw. STOP SLAVE. Um den Status auszulesen kann man SHOW SLAVE STATUS verwenden.

Es war ja auch nur eine Idee, wie man da einigermaßen professionell ran gehen könnte. Man muss das nicht so machen.


----------



## zkmlch (12. Oktober 2011)

Hat das ganze Backupverfahren einen Einfluss auf mein "Konzept"?

Den Ich habe noch immer keinen Peil...

Ich habe jetzt mal der Datenbanktabelle tbl_server eine neue Spalte zugewiesen, die Tabelle sieht nun so aus:


```
+-------------+----------------------+----------------+--------------+
| server_prio | server_address       | server_comment | server_rolle |
+-------------+----------------------+----------------+--------------+
|           5 | http://192.168.4.226 |                | slave        |
|           4 | http://192.168.4.225 |                | slave        |
|           3 | http://192.168.4.224 |                | slave        |
|           2 | http://192.168.4.223 |                | slave        |
|           1 | http://192.168.4.222 |                | master       |
+-------------+----------------------+----------------+--------------+
```

Das Feld "server_rolle" dient als Flag. Alle Checks ob der Server nun Master is oder nicht laufen über diese Kolumne, natürlich in verbindung mit der "server_address"...

Sollte Ich ein Configfile erstellen in welchem geregelt wird was ein Master und ein Slave zu tun hat oder eben nicht zu tun hat?

Rollenfunktionen:

*Master-Status*

Muss: Jeden Sonntag um 00:00 Uhr, einen MySQL Dump machen (Cronjob)
Muss: Jeden Sonntag um 01:00 Uhr, alle Downloadfiles auf die anderen Server mirroren (cronjob)
Muss: Nach dem erfolgreichen übertragen der Files auf die Partnerserver ein Mail absenden.
Muss: Admin Zutritt zum Adminpanel gewähren
Darf nicht: MySQL InsertInto Script ausführen (cronjob)

*Slave-Status*

Muss: Jeden Sonntag um 06:00 Uhr, das InsertInto (backup einlesen) ausführen
Darf nicht: Admins auf das Adminpanel lassen um änderungen vorzunehmen.

_*Login auf das Admin Panel und die Logik*_

Loggt sich der Admin auf einen Server (gem. Beispiel auf 192.168.4.222) welcher zu diesem Zeitpunkt die "master"-Rolle geniesst, so darf sich der Admin ohne weiteres auf das Admin Panel einloggen und änderungen vornehmen.

Loggt sich der Admin auf dem Server (gem. Beispiel auf 192.168.4.225) welcher momentan unter der "slave"-Rolle zu leiden hat, wird der Admin mit einer Error meldung empfangen:" Ich bin leider Slve, du darfst mich nur als master bearbeiten" Möchtest du mich zum "master machen? Ja/Nein 
Bei Ja muss in der Datenbank nun der Flag von slave auf master gewechselt werden und der ehemalige master auf slave.

War dies hilfreich?;-)


----------



## saftmeister (12. Oktober 2011)

Die Informationen hätten mal eher kommen sollen. Hiernach sehe ich vollkommen ein, das eine Replikation der DB Kanonen-auf-Spatzen ist. DB-Dump+Import genügt vollends. Ich bin davon aus, das jede Menge Laufzeit-Daten verwendet und damit hohe Datenbank-Fluktuation statt findet. Gewaltig getäuscht.

Zu den Punkten: Lässt sich alles prima mit Bordmitteln erledigen.

Du solltest aber für alle Server einen separaten Benutzer in der MySQL-DB für den Dump- und Import-Prozess anlegen, der auf den jeweiligen Umgebungen jeweils nur die entsprechenden Rechte hat, wenn du bspw. verbieten willst, das ein INSERT-INTO auf dem Master möglich ist.

Für den Fail-over-switch solltest du dir Gedanken machen, ob kompletter Hardware-Ausfall auch abgefangen werden soll. In diesem Falle empfehle ich, eine Monitoring-Komponente auf einer anderen dedizierten Maschine zu installieren, die alle Server überwacht und ggf. eine weitere Flag-Spalte umsetzt oder den neuen Master definiert => hier sehe ich erstmal größeren Aufwand auf grund von Eintragungen im Nameserver (IP tauschen, neu starten, DNS-Tabelle replizieren lassen, etc). Letztendlich könntest du eine Ausfallzeit von ca. 15-30 Min haben aufgrund von DNS-Caches, Nameservice-Replikation und so weiter. Durch bereits erwähntes Round-Robin wäre es möglich, das abzufangen, allerdings verstößt das gegen die anderen Bedingungen des Konzepts, das z.B. keine Eintragungen von Daten an den Slaves möglich sein soll.

Außerdem kann es aufwendig werden, den Fail-Over zu testen. Der Fail-Over besteht prinzipiell aus folgenden Einzelschritten, die vom Monitor erledigt werden müssten:

1. Neu-Definieren des Masters aufgrund der Tabelle, die (auch/nur) auf der Monitoring-Einheit vorhanden ist
2. Connect zum Nameserver und austausch der IP-Addresse für Domain xyz.tld
3. [Schritt abhängig von der Sicherheitsstufe der Benutzer-Einstellung in der MySQL-DB]
  - Neu-Setzen der Privilegien für den Laufzeit-Benutzer der Scripts für Dump auf dem neuen Master (INSERT INTO jetzt verboten)
4. Anlegen der Cron-Jobs für Sonntag (Dump+Dateien) - Für Dateien empfehle ich rsync - ist mehrfach erprobt und kommt gut mit großen und kleinen Mengen zurecht
5. Auf der DB des neuen Masters muss der (noch nicht konzipierte) Zugriff für den Administrator gewährt werden, das könnte man so erledigen, das bei jedem Login am Admin-Panel die Monitoring-Komponente gefragt wird, wer der aktuelle Master ist (mysql_connect() zur Monitoring-Komponente, Abfragen etc.); Hat den Vorteil, das dies ab dem Zeitpunkt möglich wäre, an dem die Monitoring-Komponente den Ausfall bemerkt hat und die Rollen neu verteilt wurden. Nachteil ist der Traffic zwischen zwei verschiedenen Maschinen bei Login am AP muss sichergestellt werden.

Zu deiner Frage mit dem Config-File: Ich glaube nicht, das dies notwendig ist, denn sämtliche Tasks beim Fail-Over erfordern ohnehin Änderungen am System. Ob man jetzt ein Konfig-File anpasst, oder Links neu im Dateisystem verlegt, ist dann erstmal egal. Beim Config-File wäre mir die Gefahr zu hoch, das eine Änderung das System im Ganzen kaputt macht. Die Monitoring-Komponente kann vorgefertige Scripte auf dem neuen Server über HTTP aufrufen, welche die entsprechenden Tasks ausführt, die im Fail-Over definiert sind.

So, das war erst mal ein bisschen Input. Du kannst mit den Vorschlägen verfahren wie du willst, evtl. hast du dadurch noch bessere Ideen.


----------



## zkmlch (12. Oktober 2011)

So ich bekomm langsam nen Überblick....
*
Benötigte Module*

*Login Script*

Ich muss ein Login Script entwickeln, welches auf einem HTML Formular basiert. Beim login muss mit einer einfachen if-Anweisung mit abfrage an den Datenbank-Flag überprüft werden ob der Server auf dem sich der User anmeldet „master“ oder „slave“ ist. Falls er nicht „master“ ist Error ausgeben:“Um mich zu bearbeiten muss Ich „master“ sein. Möchtest du mich zum Master machen? 
Option Nein: Bricht das Login verfahren ab.
Option Ja:  Macht folgendes:
1. Setzt den Flag des bisherigen „masters“ auf „slave“
2. Setzt den Flag des CurrentServers auf „master“
3. Login-Script startet eine Seesion und der User kann aufs Admin-Panel

Kann mir hier jemand helfen ein Abgestimmtes Login-Script zu Entwickeln?

*Mirror Script (angepasste Version)*

Ich muss das bestehende Mirror Script so anpassen das es zuerst eine if Anfrage an die Datenbank stellt ob der CurrentServer mit „master“ gflagt ist. Ist diese bedingung wahr so soll er den nächsten befehl im script ausführen. Ist er nicht wahr soll er sofort abbrechen.

Bestehendes Script (mirror.sh)


```
#!/bin/sh

#	Hier soll die IF Anweisung hinkommen

		
#	Backup Anweisung zum Dumpen

	mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup	

#	rsync Anweisung		  Quelle		  Ziel	

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/

	rsync --avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/
```

Kann mir jemand mit der IF-Anweisung helfen?
*
Insert-Into Script (angepasste Version)*

Ich muss das bestehende Insert-Into Script so anpassen das es zuerst eine if Anfrage an die Datenbank stellt ob der CurrentServer mit „slave“ gflagt ist. Ist diese bedingung wahr so soll er den nächsten befehl im script ausführen. Ist er nicht wahr soll er sofort abbrechen.


Gruss Patrick

Edit: @saftmeister (wiso denk ich immer an saftsack? ) Herzlichen Dank für deine Ausführliche Doku  Leider Möchte Ich das Fail-Over noch im Background lassen, da Ich zuerst das Prove of Concept der obengenannten Module realisieren möchte. Aber Ich behalt es mir sicherlich warm


----------



## zkmlch (13. Oktober 2011)

*Mirror Script (mirror.sh)*

Guten Morgen

Ich hab da mal einen Entwurf gemacht; Aber esgeht nicht...


```
#!/bin/sh

# Mirror Script (mirror.sh)
# Version 0.12 // 13.10.2011

# Scriptbeschreibung: Dieses Script soll den Ordner "downloadseite" welcher im Verzeichnis /var/www/ abgelegt ist auf allen fünf Webserver abgleichen. Jedoch nur wenn der Server "master" ist...



#	Hier soll die IF Anweisung hinkommen
	
	$mysqlhost="localhost";
	$mysqluser="root"; 
	$mysqlpwd="asdf1234"; 
	$mysqldb="db_filemanager";

	$db = @mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Konnte keine Verbindung zur Datenbank herstellen");
	mysql_select_db($mysqldb, $db);

	$sql = "SELECT server_rolle FROM tbl_server";
	$rolle = mysql_query($sql);

	$current_ip = $REMOTE_ADDR;

	current_hostname=hostname	


	if ($rolle['server_rolle']=="master" && $rolle['server_address']==$current_ip || $rolle['server_hostname']==$current_hostname){
		
#	Backup Anweisung zum Dumpen

	mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup	

#	rsync Anweisung		  Quelle		  Ziel	

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.222:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/

	rsync --avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/

	rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/

	}
```

Kann mir da jemand helfen? Danke 

*EDIT:*

Das bash kan nicht mit den Variablen anfangen... Ich frage mich nur wie Ich ohne PHP in einer Bash das gleiche ergebnis erzielen kann...

Gruss Patrick


----------



## zkmlch (14. Oktober 2011)

Hab mein Script mal Weiterentwickelt... Nun brauche Ich euere Hilfe...

Ich hab das Script sauber erklärt, sollte eigentlich alles verständlich sein. Sonst ungeniert fragen.


```
#	Mirror Script (mirror.sh)
#	Version 0.23 / Fr. 14.10.11


#	Kurzbeschreib:
#	Das Script spiegelt alle vorhandenen Downloadfiles auf alle Slave Server.
#	Der Dump und die Rsync Befehle dürfen nur ausgeführt werden wenn der Server
#	"master" ist. (Er bekommt automatisch oder manuell einen Flag in der 
#	db_filemanager in der Tabelle tbl_server unter der Spalte; server_rolle


#	Datenbankauszug:

#	+-------------+----------------------+----------------+--------------+-----------------+
#	| server_prio | server_address       | server_comment | server_rolle | server_hostname |
#	+-------------+----------------------+----------------+--------------+-----------------+
#	|           5 | http://192.168.4.226 |                | slave        |                 |
#	|           4 | http://192.168.4.225 |                | slave        |                 |
#	|           3 | http://192.168.4.224 |                | slave        |                 |
#	|           2 | http://192.168.4.223 |                | slave        |                 |
#	|           1 | http://192.168.4.222 |                | master       |                 |
#	+-------------+----------------------+----------------+--------------+-----------------+


    

# 	Definition der Varible current_ip (IP Adresse)
	simple_ip=`ifconfig eth0 | head -n 2 | tail -n 1 | cut -d: -f2 | cut -d" " -f 1`
	echo "$simple_ip";
	
	http='http://';
	ip=$simple_ip;

#	Hier sollen die beiden Variablen zusammengeführt werden: Soll Ergebniss zB: http://192.168.4.223
    	current_ip=$http . $ip;

	echo "$current_ip";

#	DB Connect
	mysql --user=root --password=asdf1234
#	DB auswählen
	use db_filemanager
#	Select Anweisung & Query 
	sql=SELECT * FROM tbl_server WHERE server_rolle = "$current_ip";
	query=mysql_query($sql);
	
	rolle=mysql_fetch_array($query);
	
	exit

	echo "$sql";
	echo "$current_ip";
	echo "$rolle";

#	IF Anweisung: mysql dump dar NUR dan ausgeführt werden wen der Server in der Datenbank
#	als master geflaggt ist. Desshalb frage Ich in der Select Anweisung nach 
#	"WHERE" server_rolle = "eigene IP Adresse" (bei der migrierung werde ich dann nach dem 
#	Hostnamen suchen.

   if `$rolle == master`{
        
#    Backup Anweisung zum Dumpen

    mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup    

#    rsync Anweisung          Quelle          Ziel    

# 	webserver222
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.222:/var/www/downloadseite/
# 	webserver223
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/
#	webserver224
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/
#	webserver225
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/
#	webserver226
rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/

    }
```

Fehlerbeschreib:

Bleibt in der Befehlszeile von MySQL stehen und fürd die SQL Befehle von mir nicht aus.
Nach eingabe von exit erscheint noch folgender Fehler:


```
ww/downloadseite/mirror.sh: 42: [new_file]: not found
/var/www/downloadseite/mirror.sh: 43: Syntax error: "(" unexpected
ach eingabe von exit erscheint noch folgender Fehler:
```


----------



## saftmeister (14. Oktober 2011)

Du machst in dem Shell******-Script einen Misch-Masch aus verschiedenen Sprachen, das kann ja nix werden. Entscheide dich für eine und bau das Script mit einer Sprache.


----------



## zkmlch (14. Oktober 2011)

Ich möchte es in Bash Sprache haben... Aber Ich komm nicht mehr weiter... Zwischenzeitlich habe Ich noch folgendes geändert:


```
sql=SELECT * FROM tbl_server WHERE server_rolle = "$current_ip";
    query=mysql_query($sql);
    
    rolle=mysql_fetch_array($query);
```

zu:


```
rolle=SELECT server_rolle FROM tbl_server WHERE server_address = "$current_ip";
```

Jetzt müsste doch alles Shell Sprache sein.... 

Gruss Patrick


----------



## saftmeister (14. Oktober 2011)

Nein, Bash hat keine Funktion mysql_query und auch keine funktion mysql_fetch_array.


----------



## zkmlch (14. Oktober 2011)

Hi saftmeister hast du das gelesen:



> Zwischenzeitlich habe Ich noch folgendes geändert:
> 
> PHP-Code:
> sql=SELECT * FROM tbl_server WHERE server_rolle = "$current_ip";
> ...



Gruss Patrick


----------



## saftmeister (14. Oktober 2011)

Und wie genau wird das jetzt an MySQL gesendet? Außerdem ist es kein String.


----------



## zkmlch (14. Oktober 2011)

hmmm desshalb stelle Ich hier ja die Frage wie Ich es umsetzten kann, das mir jemand vielleicht ne Lösung bieten kann...

MySQL wird ja geöffnet aber die Anweisungen werden nicht ausgeführt... wenn ich aber die SQL Anwisungen in eine EOFMYSQL<<< .... >>> hänge funktionieren die Variablendefinitionen innerhalb der MySQL Anweisungen nicht mehr und somit nicht usefull....

Ich dreh langsam am Rad...


----------



## saftmeister (14. Oktober 2011)

Nunja, das hier ist aber das PHP-Forum und nicht das Forum für Shell-Script (vermutlich unter Sonstige Sprachen). Du solltest dort einen Thread auf machen, dort gibt es Profis, die von Shell-Script mehr Ahnung haben, als PHP-Entwickler.


----------



## zkmlch (14. Oktober 2011)

Kannst du verschieben?


----------



## saftmeister (14. Oktober 2011)

Nein, aber ich kann dir eines verraten: Bash-Script ist nicht interaktiv. Das bedeutet, es führt den Befehl aus und wartet bis er beendet ist. Spätestens beim Aufruf von mysql (Kommandozeilen-Programm) wird das Shell-Script anhalten und warten, bis dieser beendet ist.

Du hast jetzt 2 Möglichkeiten:

1. Du verwendst das Kommando-Zeilen-Tool mysql non-interactive, das bedeutet, du gibts alle Werte als Parameter an das Kommando.
2. Du verwendest tclsh+expect und spawn, um das Tool automatisiert interaktiv (ist vermutlich noch etwas komplizierter als die Parameter-Version).


----------



## sheel (14. Oktober 2011)

Also, willst du bei PHP bleibern?
Sonst verschieb ich.


----------



## deepthroat (14. Oktober 2011)

Hi.

Warum machst du das ganze denn nicht mit PHP wenn du von Bash keine Ahnung hast?

Ansonsten,  "man bash"

Gruß


----------



## sheel (14. Oktober 2011)

OT: Von PHP wurde schon hierher gewechselt...


----------



## zkmlch (14. Oktober 2011)

Nein shell basiert

Habe jetzt mal meinen Code angepasst, der Shebang war gesetzt jedoch beim CopyPasten untergegangen... 

Mit dem angepassten Code, wird dieser Fehlerfrei (zumindest gemäss Shell): Jedoch führt er irgendwass aus aber der dump und der rsync wird einfach mal ignoriert,,,,

Angepasster Code:
vergrößern



```
#!/bin/bash

#	Mirror Script (mirror.sh)
#	Version 0.25 / Fr. 14.10.11



	simple_ip=`ifconfig eth0 | head -n 2 | tail -n 1 | cut -d: -f2 | cut -d" " -f 1`

		echo "$simple_ip";
	
	http='http://';
	current_ip="http://$simple_ip"

		echo "$current_ip";

	rolle="$(echo "SELECT * FROM tbl_server WHERE server_rolle = '$current_ip'" | mysql --user=root --password=asdf1234 db_filemanager)"

	
	exit

	
		echo "$current_ip";
		echo "$rolle";



   	if `$rolle == master`

	{
        

    		mysqldump --user=root --password=asdf1234 --databases db_filemanager > /var/www/downloadseite/dbupdate/db_backup    

   

		# 	webserver222
		rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.222:/var/www/downloadseite/
		
		# 	webserver223
		rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.223:/var/www/downloadseite/
		
		#	webserver224
		rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.224:/var/www/downloadseite/

		#	webserver225
		rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.225:/var/www/downloadseite/

		#	webserver226
		rsync -avz -e ssh /var/www/downloadseite/ patrick@192.168.4.226:/var/www/downloadseite/

    	}
```


Ausgabe:


```
root@*****:~# sh /var/www/downloadseite/mirror.sh

    192.168.4.222

    http://192.168.4.222

    Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
```

An was könnts liegen?

Gruss Patrick


----------



## zkmlch (14. Oktober 2011)

Bitte Tread löschen...

Alter Tread wurde verschoben


----------



## sheel (14. Oktober 2011)

Woher weisst du das denn, wenns erst zwei Minuten später passiert? 
Werde die Beiträge hier in den anderen Thread nehmen.
Moment...done


----------



## deepthroat (14. Oktober 2011)

zkmlch hat gesagt.:


> Nein shell basiert


Warum?

Hast du denn nun schonmal in die Manpage geschaut? Oder auch nur mal in ein beliebiges Bash-Skript gekuckt? Du kriegst ja nichtmal die Syntax hin. Bleib doch einfach bei PHP.

```
if [[ "$rolle" == "master" ]]; then
  ...
fi
```
Gruß


----------



## zkmlch (14. Oktober 2011)

Hallo deepthroat

Ich kann keine Backtiks einsetzten, da das System die Anforderungen nicht erfüllen kann, weil auf den Servern gewisse Modes laufen die das verhindern würden. Und unsauber wäre dies auch...

Zurück zum Problem:

Mir jetzt wenigstens klar warum die rsync's nicht ausgeführt werden....

Werfen wir doch einen Blick in den angepassten Codeausschnitt:

```
rolle="$(echo "SELECT server_rolle FROM tbl_server WHERE server_address = '$current_ip'" | mysql --user=root --password=asdf1234 db_filemanager)"


		echo "Ergebniss der Variabel current_ip: $current_ip";
		echo "Ergebniss der Variabel rolle: $rolle";

	exit

   	if [[ "$rolle" == "master" ]]; then
```

An der Stelle wo die Variabel rolle definiert wird, waren die DB-AnweisungenkKreuzfalsch... Wen Ich die Variable nun mit dem echo prüfe erhalte ich folgendes:


```
Ergebniss der Variabel rolle: server_rolle
master
```

Ich brauche aber nur die Dateninfo: master

In php würde ich es so machen:


```
$rolle['server_rolle']
```

Wie setze ich das nun um?

Gruss Patrick


----------



## deepthroat (14. Oktober 2011)

zkmlch hat gesagt.:


> Ich kann keine Backtiks einsetzten


Was soll das heißen? Niemand hat irgendwas von Backticks erzählt...


----------



## zkmlch (14. Oktober 2011)

deepthroat hat gesagt.:


> Was soll das heißen? Niemand hat irgendwas von Backticks erzählt...



Du hast doch gesagt ich soll bei PHP bleiben... Wie soll Ich die rsync's realisieren ohne Backtick zu verwenden?

Zudem fehlt mir nur noch eine Datenbankanweisung in der Shell-Sprache

Gruss Patrick


----------



## deepthroat (14. Oktober 2011)

zkmlch hat gesagt.:


> Du hast doch gesagt ich soll bei PHP bleiben... Wie soll Ich die rsync's realisieren ohne Backtick zu verwenden?


Dir ist schon klar, dass man PHP auch auf der Kommandozeile als Skriptsprache verwenden kann, ja?


zkmlch hat gesagt.:


> Zudem fehlt mir nur noch eine Datenbankanweisung in der Shell-Sprache


Ja, dann...  "man bash"

Gruß


----------



## zkmlch (14. Oktober 2011)

bin dabei 

Habe mich dem Manual gewidmet...

Das einzige was Ich gefunden habe um mein Problem beheben zu können ist die "cut" anweisung...

ich habe mich mit "man cut" auch über diesen befehl schlau gemacht.
Habe jetzt einige Zeit rumprobiert aber das was ich möchte, dass "master" alleine steht geht nicht:


```
uncut_rolle="$(echo "SELECT server_rolle FROM tbl_server WHERE server_address = '$current_ip'" | mysql --user=root --password=asdf1234 db_filemanager)" 

	rolle=`$uncut_rolle | cut -d: -f1`;
```

Schlussendlich macht er gar keine Ausgabe mer wenn ich die Variabel anzeigen möchte -.-'

Jemand Rat?

Gruss Patrick


----------



## deepthroat (14. Oktober 2011)

zkmlch hat gesagt.:


> Habe mich dem Manual gewidmet...
> 
> Das einzige was Ich gefunden habe um mein Problem beheben zu können ist die "cut" anweisung...


man bash -> Arrays
man bash -> variable expansion



zkmlch hat gesagt.:


> ```
> rolle=`$uncut_rolle | cut -d: -f1`;
> ```


Du führst hier was immer in $uncut_rolle drin steht als Befehl aus. Das wird nicht gehen. Probiers mal mit echo.

Ich versteh immer noch nicht warum du nicht bei PHP bleibst. Du verwendest auch immer noch PHP Tags...

Gruß


----------

