PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datensicherung Ala Python muha ^^



bluecrystal21
07-09-2010, 09:43
import os
import time

# Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/home/davidlinux/Backup/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis', heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -cvzf %s %s' % (ziel, ' '.join(quellen))
# Sicherung starten
if os.system(tar_befehl) == 0:
print 'Erfolgreiche Sicherung nach', ziel
elif os.system(tar_befehl) == 1:
print 'Sicherung fehlgeschlagen!'
else:
print 'Fehler'
so
einige von Euch kennen das schon sicher :) Jetz möcht ich aber noch ne Datei machen die die Sicherung Stoppt was hier nicht steht ich hab eine Schleife um die Sicherung gebaut. Wenn Variable= 2 soll der die Sicherung ausführen jetzt will ich aber das noch dort steht Variable = 1 Sicherung abbrechen Evtl jemand ne Idee?

John W
07-09-2010, 11:06
Von Schleife seh ich nix. Was durchaus Probleme machen könnte ist der (ungefragt) doppelte Aufruf von tar wenn der erste fehlschlägt; ich würde den Teil so umändern, wenn du da eine Abfrage drin haben willst:


# Sicherung starten
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Erneut versuchen? (J,Ja,Y,Yes,N,Nein,No): ").lower
if ans in ["J","Ja","Y","Yes","N","Nein","No"]:
continue
print "Abgebrochen."
break

bluecrystal21
07-09-2010, 12:36
#usr/bin/pyton
import linecache
import sys, dbus
import os
import time

#L ist eine Variable in der, der Wert steht.
L = 2

if L == 4 :
outfile=open("Datei.ini","w+")
for line in open("Daten.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif L == 2 :
# Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/home/davidlinux/Backup/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis', heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -cvzf %s %s' % (ziel, ' '.join(quellen))
# Sicherung starten
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Erneut versuchen? (J,Ja,Y,Yes,N,Nein,No): ").lower
if ans in ["J","Ja","Y","Yes","N","Nein","No"]:
continue
print "Abgebrochen."

#def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props =remote_object.Shutdown(dbus_interface='org.freede sktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
#if __name__ == "__main__":
# shutdown()


also hier der Code und deine Idee bringt mich in eine Endlos-Schleife achja verwende Linux ^^

John W
07-09-2010, 15:23
Merke: Kopiere meinen Code immer komplett... Du hast ein abschließendes break am Ende der Schleife (als letztes Statement der Schleife, außerhalb des if-else-Konstrukts) vergessen.

bluecrystal21
07-09-2010, 15:54
selbst mit dem break gehts nich....
linux-y8or:/mnt/Freigaben/00-16-17-15-56-61 # python datei.py
File "datei.py", line 41
continue
SyntaxError: 'continue' not properly in loop

John W
07-09-2010, 16:01
#usr/bin/python
import linecache
import sys, dbus
import os
import time

#L ist eine Variable in der, der Wert steht.
L = 2

if L == 4 :
outfile=open("Datei.ini","w+")
for line in open("Daten.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif L == 2 :
# Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/home/davidlinux/Backup/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis', heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -cvzf %s %s' % (ziel, ' '.join(quellen))
# Sicherung starten
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Erneut versuchen? (J,Ja,Y,Yes,N,Nein,No): ").lower
if ans in ["J","Ja","Y","Yes","N","Nein","No"]:
continue
print "Abgebrochen."
break

#def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props =remote_object.Shutdown(dbus_interface='org.freede sktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
#if __name__ == "__main__":
# shutdown()

bluecrystal21
08-09-2010, 07:25
Aber kann ich vll davor für den Anwender einfügen das wenn er die Sicherung Stoppen will STRG +C drücken muss und ich hab noch nen Fehler er sagt shutdown() the name is not definied
x.x "on line 55"

bluecrystal21
08-09-2010, 08:53
so weit so gut so... also ^^ er soll mit der Sicherung nicht anfangen sondern sagen Sicherung STOP ^^

John W
08-09-2010, 14:47
try-Klausel drumherum, am Ende des Skriptes dann:


try:
# bisheriger Code, eine Stufe weiter eingerückt
except KeyboardInterrupt:
print "Abgebrochen."

Zum Einrücken kannst du folgendes Skript benutzen:


sed -i 's#^# #' <datei>

bluecrystal21
09-09-2010, 08:37
du meinst somit ne fehlerbehandlung drumbauen hmm dann muss ich nur dem benutzer klar machen das er STRG und C drücken muss ich versuchs ^^

bluecrystal21
10-09-2010, 06:17
hat einer vll ne Idee wie man tar zum schweigen bringt? möchte den Benutzern ne Nachricht schicken das sie strg +c drücken müssen um abzubrechen ^^

John W
10-09-2010, 10:02
Ausgabe nach /dev/null pipen: os.system("tar ... > /dev/null").

bluecrystal21
10-09-2010, 10:43
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie STRG + C um die Sicherung abzubrechen
tar: Eine der Optionen „-Acdtrux“ ist notwendig.
„tar --help“ oder „tar --usage“ gibt weitere Informationen.
tar: Entferne führende „/“ von Elementnamen
/home/davidlinux/DP/
/home/davidlinux/DP/dateiexisttest.py
/home/davidlinux/DP/dp_macadress.py
/home/davidlinux/DP/dp_macadress.txt
/home/davidlinux/DP/macadress.txt
/home/davidlinux/DP/dateilese.py
/home/davidlinux/DP/dateiexist.py
/home/davidlinux/DP/.dp_clienttest.py.swp
/home/davidlinux/DP/mount.txt/
/home/davidlinux/DP/dpclienttask.py
/home/davidlinux/DP/clienttask.ini
/home/davidlinux/DP/laufwerkexy
/home/davidlinux/DP/mountbefehl.txt
/home/davidlinux/DP/dp_clienttest.py
Erfolgreiche Sicherung nach "/etc/dp/Backup20100910/114027.tar"



er zeigt mir das immer auf der console an was er sichert und eben das soll er ja net zeigen (der Ordner ist ja nur ein kleiner ausschnitt) aber wenn ich die große home nehm dann sehn die Benutzer ja nicht mehr das sie STRG+C drücken müssen ^^

hier anbei der Code:


#usr/bin/pyton
import linecache
import sys, dbus
import os
import time

#L ist eine Variable in der, der Wert steht.
auswahl = 0

if auswahl == 4 :
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif auswahl == 0 :

#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/DP',]
ziel_verzeichnis = '/etc/dp/Backup'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie STRG + C um die Sicherung abzubrechen'

#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis' , heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -cvzf %s %s' % (ziel, ' '.join(quellen))
os.system("tar > /dev/null")
#tar_befehl=sys.stdin.readline()
# Sicherung starten
try:
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower
print 'Sicherung abgebrochen'
break
except KeyboardInterrupt:
print "Sicherung beendet"

#elif auswahl == 2:
# def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
#
#if __name__ == "__main__":
# shutdown()

ausserdem passt ihm das dritte elif nicht :( Hoffe ihr könnt mir helfen :)

lg und schönes Sonniges Wochenende


bluecrstyal21

John W
10-09-2010, 13:42
os.system("tar > /dev/null")müsste

os.system("%s > /dev/null" % tar_befehl)heißen. Du könntest aber auch von tar_befehl den Parameter -v wegnehmen und os.system(tar_befehl) ausführen:


#usr/bin/python
import linecache
import sys, dbus
import os
import time

#L ist eine Variable in der, der Wert steht.
auswahl = 0

if auswahl == 4 :
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif auswahl == 0 :

#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/DP',]
ziel_verzeichnis = '/etc/dp/Backup'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie STRG + C um die Sicherung abzubrechen'

#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis' , heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -czf %s %s' % (ziel, ' '.join(quellen))
os.system(tar_befehl)
#tar_befehl=sys.stdin.readline()
# Sicherung starten
try:
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower
print 'Sicherung abgebrochen'
break
except KeyboardInterrupt:
print "Sicherung beendet"

#elif auswahl == 2:
# def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
#
#if __name__ == "__main__":
# shutdown()

Obigen Code einfach übernehmen, dann ist auch die Shebang mal richtig geschrieben...

jeebee
11-09-2010, 09:25
Die Shebang stimmt immer noch überhaupt nicht... Richtig wäre
#!/usr/bin/python oder besser
#!/usr/bin/env python

bluecrystal21
21-09-2010, 07:48
cool das geht wirklich nur das er mir nun immer sagt shutdown the name is undefinied! sorry das ich jetzt erst schreib lag ne Woche mit Grippe im Bett und da hat ich echt keine Lust zu Programmieren +grins+

bluecrystal21
21-09-2010, 09:42
ah hab meinen fehler gefunden durch falsches einrücken vielen dank für eure hilfe :)

bluecrystal21
21-09-2010, 10:13
kann ich noch sowas einbauen wie.... alle 30 tage sicherung ^^ das wär dann optimalste arbeit für mich gewesen.

John W
21-09-2010, 10:15
Nur kurz, weil ich es grad eilig habe: Du kannst einen Cronjob anlegen, man crontab hilft dir da weiter.

bluecrystal21
21-09-2010, 10:17
cool danke John =)

bluecrystal21
21-09-2010, 10:35
ich hab nun gelesen das cronjob ja ein dämon ist,
aber so in das Script kann ich das nicht implementieren oder?

John W
21-09-2010, 11:53
Cronjobs werden periodisch nach Regeln aufgerufen - du kannst jedes Programm über einen Cronjob starten.
Du kannst das Skript einfach in /etc/cron.monthly/ kopieren, es muss ausführbar sein (chmod +x <pfad>) und als erste Zeile die korrekte Shebang-Zeile enthalten:


#!/usr/bin/env python
Sollte es das Verzeichnis /etc/cron.monthly nicht geben, musst du folgende Zeile in /etc/crontab eintragen:


* * 1 * * root <pfad>
Das Skript wird dann am ersten jeden Monats aufgerufen.

bluecrystal21
21-09-2010, 15:47
hey ^^ danke für die idee john aber mein chef ist damit nicht zufrieden :(
der meint ich muss unbedingt das implementieren x.x

John W
21-09-2010, 16:49
DEN Chef möcht ich ja gleich mal köpfen. Cron ist extra für sowas geschrieben worden.
Lass mich raten: Schlipsträger?
In dem Fall halt ihm mal folgendes Beispiel vor: Das Skript stürzt aus unerwarteten Begebenheiten ab oder jemand beendet es unvorsichtigerweise. Die Sicherung bleibt aus, im Zweifelsfall sind Daten weg, das Programm also dadurch sinnlos.
Jetzt das ganze mit Cron: Da kann man sich eine E-Mail schicken lassen, wenn das Skript fehlerhaft beendet (Code unten), zudem wird die Sicherung unabhängig davon durchgeführt, ob das Skript irgendwann mal von Hand gestartet wurde - und zwar jeden Monat.
Damit Cron seinen Job nicht mehr erledigt, muss man die Crontab abändern oder cron beenden - das braucht root-Rechte, dass macht mit Sicherheit kein Volldepp der von nix ne Ahnung hat.
Zudem wird das Skript auch später ausgeführt, wenn der Rechner am 1. nicht eingeschaltet war, sofern anacron installiert ist; anacron überprüft nämlich, ob ein Cronjob zu gegebenen Zeitpunkt ausgeführt wurde - ist das nicht der Fall, wird das nachgeholt.

Wenn dein Chef Admin ist, würde ich seine Argumentation dazu gerne hören.

Hier noch der Crontab-Eintrag für E-Mail-Versand bei Fehlern:


* * 1 * * root <pfad> || date +"Skript fehlgeschlagen am %d.%m.%y um %H:%M:%S" | mail -s ERROR admin@host.de

bluecrystal21
22-09-2010, 07:29
joa ich werd dem nix dazu geigen vll kann ich sowas wie cronjob ja nachbauen und in ein extra-skript packen x.x.
aber danke für die infos :)

bluecrystal21
22-09-2010, 08:15
aber mir is inzwischen eine Idee eingefallen :).
ich nehm die strftime her und die localtime damit ich weis okay es ist das un das Datum und wenn dann das Datum mit dem 1. des Monats passt dann könnt ichs doch ausführen lassen oder is die Idee blöd? :(
hab schon bissl angefangen und versuche rumzuexperimentieren hihi ^^

danke für eure Hilfe und Tipps

eure kleine bluecrystal21 ^^

bluecrystal21
22-09-2010, 13:14
also^^ mein jetziger Stand is gerade:



#!/bin/bash
#!/bin/sh
#! /usr/bin/env python

import time
import os
from time import *
lt = localtime()
d1=strftime("%d", lt)
datum= '22'
if d1 == datum :
print 'Sicherung wird gestartet'
externesProgramm = "Sicherung.py"
os.system(externesProgramm)
else:
print 'Fehler'


das sieht so aus ich will ja die datei öffnen und ausführen das problem is so wie ichs öffnen will mags mich einfach net lol^^
Fehlermeldung:


linux-y8or:/mnt/Freigaben/00-16-17-15-56-61 # python datei.py
Sicherung wird gestartet
sh: Sicherung.py: Kommando nicht gefunden.


einer vll ne Idee was ich falsch gemacht hab :(

John W
22-09-2010, 15:02
Der Pfad muss absolut angegeben sein (z.B. /home/benutzer/bin/Sicherung.py).
Noch einfacher wäre folgendes Bash-Skript:


[[ "$(date +%d)" == "01" ]] && /home/benutzer/bin/Sicherung.py
Das muss dann halt nur einmal täglich aufgerufen werden, das ginge z.B. so:


LAST=""
while :
do
NEWLAST="$(date +%D)"
if [ "$NEWLAST" != "$LAST" -a "$(date +%d)" == "01" ]
then
/home/benutzer/bin/Sicherung.py && LAST="$NEWLAST" && date +"Backup um %d.%m.%Y um %H:%M erfolgreich abgeschlossen." >> /var/log/backup.log
fi
sleep 1h
done
Es wird damit jede Stunde geprüft, ob heute der erste des Monats ist, sofern sich das Datum geändert hat. Wenn das Backup erfolgreich ist, wird das letzte Ausführungsdatum auf heute gesetzt und ein Logstatus geschrieben (braucht root-Rechte, Datei /var/log/backup.log kann aber geändert werden).

bluecrystal21
22-09-2010, 15:11
jetz hab ichs geschafft hehe hab mit execfile('/pfad zur Sicherung.py') gemacht aber nun muss ich die Dateien die neu dazu kommen Sichern und nur die die alten werden ja bereits gesichert

bluecrystal21
22-09-2010, 15:14
glaubst du os. könnte dafür mein Freund sein?
bin dir echt vieles Dankbar John :)

John W
22-09-2010, 15:20
Da könnte man einmalig einen tar-Update-Befehl absetzen:

tar -rvzf <letztes Archiv> <dateiliste>
Damit werden nur Dateien angehängt, die im Archiv nicht existieren.

bluecrystal21
22-09-2010, 15:39
hm gute idee aber letztes archiv woher weis ich welches das war bzw wo soll ich den befehl inkopieren ins sicherungsskript unter dem os.system oder?:confused:

John W
22-09-2010, 15:43
Einfach in die Shell eintippen. Die zuletzt bearbeitete Datei kannst du dir mit folgendem Befehl anzeigen lassen:


ls -1t | head -n1

Das im Sicherungsverzeichnis ausführen, dann solltest du das letzte Archiv haben.
Eig. solltest du das aber auch über den Dateinamen machen können!

bluecrystal21
22-09-2010, 15:49
naja der chef will mal wieda ne geschriebene "funktion" im skript .__. ich mit meinen 21 jahren verzweifel noch mit dem hoffentlich is das Projekt bald zu ende .....

bluecrystal21
22-09-2010, 15:57
ich werd jetz erstmal feierabend für heut machn vielen dank John das du dir so viel zeit für mich Neuling nimmst. Hoff ich vergraul dich net +grins+
auch an die anderen vielen dank schönen Feierabend noch :)

lg bluecrystal21

John W
22-09-2010, 15:58
Jetzt mal etwas Code-"Reuse":


quellen = ['/home/davidlinux/DP',]
ziel_verzeichnis = '/etc/dp/Backup'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
Damit wissen wir, dass das Backupskript im Verzeichnis /etc/dp/Backup nach Name sortiert an letzter Stelle steht.
Dann kann man das so machen:


quellen = ['/home/davidlinux/DP',]
listing=os.listdir('/etc/dp/Backup')
listing.sort()
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -rzf %s %s' % (listing[-1], ' '.join(quellen))
os.system(tar_befehl)

bluecrystal21
23-09-2010, 07:28
python dp_cron.py
Sicherung wird gestartet
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
Traceback (most recent call last):
File "dp_cron.py", line 14, in <module>
execfile('/mnt/Freigaben/00-16-17-15-56-61/dp_client.py')
File "/mnt/Freigaben/00-16-17-15-56-61/dp_client.py", line 35, in <module>
listing=os.listdir('/etc/dp/Backup')
OSError: [Errno 2] No such file or directory: '/etc/dp/Backup'


kommt wenn ich dp_cron.py ausführ die Datei dp_cron.py zeig ich dir hier moment.



#!/bin/bash
#!/bin/sh
#! /usr/bin/env python

import time
import os
from time import *
lt = localtime()
d1=strftime("%d", lt)
datum= '23'
if d1 == datum :
print 'Sicherung wird gestartet'
execfile('/mnt/Freigaben/00-16-17-15-56-61/dp_clienttest.py')
else:
print 'Fehler'

hab jetz nur das datum="23" geändert um es heute zu testen ^^

bluecrystal21
23-09-2010, 10:19
So nun hab ich bissle gegoogelt und rausgefunden:



Anzumerken ist, dass in einem gepackten Archiv, auch wenn dies durch »tar« selbst komprimiert wurde, keine Dateien hinzugefügt, erneuert oder gelöscht werden können. Dies kann nur im unkomprimierten tar-Archiv geschehen.

also muss ich das archiv Entpacken und dann neu packen und optionen so einstellen das die entpackten Daten gelöscht werden?!

bluecrystal21
23-09-2010, 12:12
#! /usr/bin/env python
import linecache
import sys, dbus
import os
import time
import subprocess
auswahl = 0

if auswahl == 4 :
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif auswahl == 0 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/DP',]
ziel_verzeichnis = '/etc/dp/Backup'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis' , heute, 'erfolgreich angelegt'


# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -czf %s %s' % (ziel, ' '.join(quellen))
os.system(tar_befehl)
quellen = ['/home/davidlinux/DP',]
listing=os.listdir('/etc/dp/')
listing.sort()
ziel = heute + os.sep + jetzt + '.tar'
tar_befehle = 'tar -xf %s %s' % (ziel, ' '.join(quellen))
tar_befehl = 'tar -uzf %s %s' % (listing[-1], ' '.join(quellen))
os.system(tar_befehle)
os.system(tar_befehl)

# Sicherung starten
try:
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower
print 'Sicherung abgebrochen'
break
except KeyboardInterrupt:
print "Sicherung beendet"


elif auswahl == 2 :
def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

if __name__ == "__main__":
shutdown()

so sieht mein Code derzeit aus

bluecrystal21
23-09-2010, 12:36
problemchen gelöst :)


# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -czf %s %s' % (ziel, ' '.join(quellen))
os.system(tar_befehl)
tar_befehle = 'tar -uf /etc/dp/Backups'
os.system(tar_befehle)

bluecrystal21
23-09-2010, 12:41
man ey ich war so weit es passt schon wieder net... -.-
er will ne Differenzsicherung.
das heisst wenn 25.märz is von 25 märz bis jetz gesichert werden jetz darf ich mein externes skript wieder umbauen hach es is zum verzweifeln.

bluecrystal21
23-09-2010, 12:51
wie soll man ein datum was irgendson idiot eingibt ne variable machen woher soll das programm wissen wann er letzte sicherung gemacht hat wenn ich n datum von hand eingeb xD.

Hast ne Ahnung wie ich python sag such letzte Sicherung und dann sicher mal nur oben drauf.. ^^

John W
23-09-2010, 13:33
Das war in meinem letzten Code, der Pfad schien allerdings falsch zu sein, daher die Fehlermeldung " OSError: [Errno 2] No such file or directory: '/etc/dp/Backup'"
Wenn du den Pfad anpasst, bekommst du die zuletzt angelegte Sicherung, sofern die Benennung weiterhin dem Schema "<Jahr><Monat><Tag>" folgt.

Das hier ist jetzt das Skript, das Cron ersetzt, dp_cron.py brauchst du nicht mehr (dein Python-Skript müsste noch mehr angepasst werden, damit es Cron ersetzen könnte):


LAST=""
while :
do
NEWLAST="$(date +%D)"
if [ "$NEWLAST" != "$LAST" -a "$(date +%d)" == "01" ]
then
/home/benutzer/bin/Sicherung.py && LAST="$NEWLAST" && date +"Backup um %d.%m.%Y um %H:%M erfolgreich abgeschlossen." >> /var/log/backup.log
fi
sleep 1h
done


Du solltest deinen Code nochmal deutlich überarbeiten, Konfigurationen (Pfade usw.) nach oben, dann Funktionen die einzelne Jobs ausführen (z.B. buildPath(...), mkBackup(...), mkIncBackup(), ...) und zum Schluss eine Main-Funktion.
Sieh dich am besten etwas im Forum um, da findest du einige Codes, die nach dem Schema aufgebaut sind.

bluecrystal21
23-09-2010, 13:38
des Problem is ich brauch für differenzielle Sicherung weil 1h sleep das bringt nix da sichert der wieder un dp_cron.py hab ich einfach so genannt weil mir kein name eingefalln is +grins+ aba nun hab ich den pfad das tar hinbekommen aber das mit dem datum passt einfach net es soll differenziell werdn -.-

bluecrystal21
23-09-2010, 13:45
egal ich hab kopfweh in 15 mins geh ich heim mir solls egal sein kentucky fried chicken ich komm un futter dich weg -.-

John W
23-09-2010, 13:57
1h sleep das bringt nix da sichert der wiede
Falsch, es wird geprüft, ob sich während der Stunde der Tag geändert hat (z.B. vom 3. auf den 4.), wenn das der Fall ist, wird geprüft, ob es sich um den 1. Tag des Monats handelt. Ist das alles der Fall, wird gesichert, sonst nicht. Sollte beim Sichern ein Fehler auftreten, wird allerdings nach einer Stunde erneut versucht, zu sichern. Wenn das nicht so sein soll, folgendes:


then
/home/benutzer/bin/Sicherung.py && LAST="$NEWLAST" && date +"Backup um %d.%m.%Y um %H:%M erfolgreich abgeschlossen." >> /var/log/backup.log
fi
in Folgendes ändern:


then
LAST="$NEWLAST"
/home/benutzer/bin/Sicherung.py && date +"Backup um %d.%m.%Y um %H:%M erfolgreich abgeschlossen." >> /var/log/backup.log
fi

bluecrystal21
23-09-2010, 16:51
naja mein chef hat jetz schon wieder umüberlegt nun muss ich nen datum aus ner datei lesen und das datum von dort nehmen un von dem datum weg sichern bis zum heutigen tag quasi oh man john ich bin dir echt dankbar aber ich nehm jetz dann echt ne festplatte un schmeiss dem an den kopf -.-

John W
23-09-2010, 18:01
ich nehm jetz dann echt ne festplatte un schmeiss dem an den kopf -.-
Hat er auch verdient, aber 3 Sachen musst du umbedingt machen:
1. Video machen
2. Hochladen
3. Link posten
Ich will mich auch daran erfreuen :D

bluecrystal21
24-09-2010, 07:15
loool glaub ich dir aufs Wort

bluecrystal21
24-09-2010, 08:30
naja Mein skirpt is eh sehr weit jetz hab ich das mitn Datum jetz muss ich nur im Sicherungsskript ändern das der die Variable aus der Datei holt jetz is nur das Problem da das dort steht


boottime= 5D zum bleistift und dann soll der nach dem = die Variable auswerten das D weglassen nur die Zahl nehmen und dann das sicherungsskript ausführen

John W
24-09-2010, 10:07
Das liest boottime aus und speichert es in time (Bash):

time=$(sed -nr 's#^boottime=([0-9]+)D?#\1#p')
Python würde so aussehen:


import re

...

for line in datei.readlines():
if line.startswith('boottime='):
time=re.split('^boottime=([0-9]+)D?', line)[1]

bluecrystal21
24-09-2010, 10:11
das heisst also das time die neue variable is für die if-funktion?

John W
24-09-2010, 10:13
In time hast du die Zeit, also hier 5 (in Python als String, kannst du mit int(time) umwandeln).

bluecrystal21
24-09-2010, 10:15
also nochmal meine Datei kommt vom Server +g+ ich bin ja client.
der server schreibt

[Abaclis_Console]
Boottime=5D


<~ aus dieser 2ten Zeile brauch ich nur die zahl nach dem = und vor dem D
dann wäre mein sicherungsskript endlich fertig hihi

bluecrystal21
24-09-2010, 10:17
ich bin so weit das meine ausgabe 5D ausgibt nur das D muss noch weg =)

bluecrystal21
24-09-2010, 10:40
datei = open ("dp_clienttask.ini","r")
Zeile = datei.readlines()
auswahlen=Zeile[1].strip().split('=([0:9])D?', Zeile)[1]
datei.close()
print auswahlen

ergibt:

python dp_client.py
Traceback (most recent call last):
File "dp_client.py", line 11, in <module>
auswahlen=Zeile[1].strip().split('=([0:9])D?', Zeile)[1]
TypeError: an integer is required

John W
24-09-2010, 10:51
Oben "import re" einfügen, und folgendes ist dann richtig:


auswaehlen=int(re.split('^boottime=([0-9]+)D?', line)[1])

bluecrystal21
24-09-2010, 10:54
python dp_client.py
Traceback (most recent call last):
File "dp_client.py", line 11, in <module>
auswaehlen=int(re.split('^boottime=([0-9]+)D?', Zeile)[1])
File "/usr/lib/python2.6/re.py", line 167, in split
return _compile(pattern, 0).split(string, maxsplit)
TypeError: expected string or buffer


Keine ahnung was ich nun falsch gemacht hab ^^




#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import linecache
import sys, dbus
import os
import time
import subprocess
import re
datei = open ("dp_clienttask.ini","r")
Zeile = datei.readlines()
auswaehlen=int(re.split('^boottime=([0-9]+)D?', Zeile)[1])
datei.close()
print auswaehlen

John W
24-09-2010, 12:44
auswaehlen=int(re.split('^boottime=([0-9]+)D?', Zeile[1])[1])

bluecrystal21
24-09-2010, 12:48
ja hab ich schon versucht geht aber net?

bluecrystal21
24-09-2010, 12:49
Traceback (most recent call last):
File "dp_client.py", line 12, in <module>
auswaehlen=int(re.split('^boottime=([0-9]+)D?', Zeile[1])[1])
IndexError: list index out of range

John W
24-09-2010, 12:52
Split vergessen, da ist es:


auswaehlen=int(re.split('^boottime=([0-9]+)D?', Zeile.split()[1])[1])

bluecrystal21
24-09-2010, 12:53
Traceback (most recent call last):
File "dp_client.py", line 12, in <module>
auswaehlen=int(re.split('^boottime=([0-9]+)D?', Zeile.split()[1])[1])
AttributeError: 'list' object has no attribute 'split'


hm nein das will er auch nich

bluecrystal21
24-09-2010, 12:55
was ich mir halt denk das boottime= 5D das 5 D z.b. is ja nen String warum muss ich da int hinsetzen? oder lieg ich da falsch? gott das tar mit dem update passt auch net er will einzelne Dateien sichern lassen also nen Volles Backup und dann einzelne Daten sichern

John W
24-09-2010, 13:10
int brauchst du, wenn du mit dem Wert rechnen willst, mir ist nicht ganz klar, wofür du das brauchst, aber Zahlen sind normalerwweise zum Rechnen da, in kannst du aber weglassen, wenn du nicht rechnen musst.

Dein Datensatz scheint allerdings etwas merkwürdig zu sein, bist du dir sicher dass boottime=5D in der 2. Zeile steht?
Sonst nimm stattdessen folgendes:


for line in Zeile.split():
if line.strip().startswith("boottime="):
auswaehlen=re.split('^boottime=([0-9]+)D?', Zeile.strip().split()[1])[1].strip()
break

bluecrystal21
24-09-2010, 13:13
boottime is ne Variable die mein Arbeitskollege festgelegt hat, die ändert sich ständig deswegen bleibt die 5 auch nie ^^
nur zum rechnen brauch ich sie nicht naja du musst dir so vorstellen

text
Variable= 6D
wenn 6 drin steht
System herunterfahren
wenn 5 drinsteht Sicherung
so wird das gebaut ^^

bluecrystal21
24-09-2010, 13:14
ich schick dir kurz Private Nachricht ^^

John W
24-09-2010, 13:24
auswaehlen=re.split('^boottime=([0-9]+)D?', Zeile.strip().split()[1].lower())[1].strip()
Immer diese Case-Sensitive-Programmierung... :D

bluecrystal21
24-09-2010, 13:30
John? du wirst mich hassen...
aber es Funktioniert nich +heul+ :(
+duck+ bitte nich schlagn bin ein ganz braves mädel x)

John W
24-09-2010, 13:38
Iwie hatte ich vergessen Zeile durch line zu ersetzen; wenn das nicht klappt, ist irgendwas kaputt:


for line in Zeile.lower().split():
if line.strip().startswith("boottime="):
auswaehlen=re.split('^boottime=([0-9]+)[^0-9]*?$', line.strip())[1]

bluecrystal21
24-09-2010, 13:39
python dp_client.py
Traceback (most recent call last):
File "dp_client.py", line 12, in <module>
auswaehlen=re.split('^boottime=([0-9]+)D?', Zeile.strip(" ").split()[1].lower())[1].strip
AttributeError: 'list' object has no attribute 'strip'

bluecrystal21
24-09-2010, 13:42
python dp_client.py
Traceback (most recent call last):
File "dp_client.py", line 12, in <module>
for line in Zeile.lower().split():
AttributeError: 'list' object has no attribute 'lower'

okay ich glaub des wird nix mehr....
weisst du vll ob ich das so machen könnte mit..
trennen das 5D dasteht in ne Datei schreiben nochmal öffnen und nochmal trennen könnte?
das is zwar Sauumständlich aber dann hätt ich nur noch das Sicherungsproblem -.-

John W
24-09-2010, 13:44
for line in Zeile:
if line.lower().strip().startswith("boottime="):
auswaehlen=re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1]
readline spckt keinen Stream aus, das war mein Fehler.

bluecrystal21
24-09-2010, 13:47
krass du hasts gepackt geil ey :D jetz muss ich nur noch schauen das er in die schleife von if läuft -.-
Moah ich bin dir So dankbar eig solltest du von meinen job mindestens die hälfte kriegen XD
Aber ich bin dir echt so Dankbar das du immer mir hilfst <3

bluecrystal21
24-09-2010, 13:51
#!/bin/sh
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import linecache
import sys, dbus
import os
import time
import subprocess
import re
datei = open ("dp_clienttask.ini","r")
Zeile = datei.readlines()
for line in Zeile:
if line.lower().strip().startswith("boottime="):
auswahl=re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1]
datei.close()
print auswahl
if auswahl == 4 :
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif auswahl == 5 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/DP',]
ziel_verzeichnis = '/etc/dp/Backup'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis' , heute, 'erfolgreich angelegt'


# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -czf %s %s' % (ziel, ' '.join(quellen))
os.system(tar_befehl)
tar_befehle = 'tar -uf /etc/dp/Backups'
os.system(tar_befehle)
quellen = ['/home/davidlinux/DP',]
listing=os.listdir('/etc/dp/')
listing.sort()
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -rzf %s %s' % (listing[-1], ' '.join(quellen))
os.system(tar_befehl)

# Sicherung starten
try:
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower
print 'Sicherung abgebrochen'
break
except KeyboardInterrupt:
print "Sicherung beendet"


elif auswahl == 2 :
def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

if __name__ == "__main__":
shutdown()



Derzeitiger Stand der Dinge und er gibt aus print 5 das wars er Arbeitet die Schleife nicht durch :(

John W
24-09-2010, 14:03
Da ist ein Fehler mit ans=raw_input unterhalb von "#Sicherung starten":


ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower
es müsste


ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower()
sein. Ich hab den Code nochmal überarbeitet, so funktioniert das:


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import sys, dbus
import os
import time
import subprocess
import re

datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

print auswahl

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif auswahl == 5 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/DP',]
ziel_verzeichnis = '/etc/dp/Backup'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis' , heute, 'erfolgreich angelegt'

# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -czf %s %s' % (ziel, ' '.join(quellen))
os.system(tar_befehl)
tar_befehle = 'tar -uf /etc/dp/Backups'
os.system(tar_befehle)
quellen = ['/home/davidlinux/DP',]
listing=os.listdir('/etc/dp/')
listing.sort()
ziel = heute + os.sep + jetzt + '.tar'
tar_befehl = 'tar -rzf %s %s' % (listing[-1], ' '.join(quellen))
os.system(tar_befehl)

# Sicherung starten
try:
while True:
exitstatus=os.system(tar_befehl)
if exitstatus == 0:
print 'Erfolgreiche Sicherung nach "%s"' % ziel
else:
print 'Sicherung fehlgeschlagen! (Statuscode: %d)' % exitstatus
ans=raw_input("Aktion wird abgebrochen! (Bitte Druecken Sie Enter!): ").lower()
print 'Sicherung abgebrochen'
break
except KeyboardInterrupt:
print "Sicherung beendet"


elif auswahl == 2 :
def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e
Entscheidend war doch das int(), da du den Vergleich mit Zahlen durchführst.

bluecrystal21
24-09-2010, 14:10
stimmt und nun zur Sicherung der Chef meint ich soll mir das mal ansehen:


http://forum.ubuntuusers.de/topic/ein-datensicherungs-script-erstellen/
die zwei zeilen:

find /home/thunder-storm -newer /home/thunder-storm/referenzdatei -exec cp -d --parents {} /path/to/backup/dir/ \;
touch /home/thunder-storm/referenzdatei

er will quasi so ne Liste machen und alles was in der liste steht soll in eine extra Datei gepackt werden
irgendwie so

bluecrystal21
24-09-2010, 14:12
John wenn du irgendwann kein bock mehr hast mir zu helfen..dann versteh ich das zu 100 prozent XD bin anfänger auf python und muss son Zeug produzieren bzw du hilfst mir immer. Bin eig PHP-Mensch hatte in meiner Prüfung in PHP 100% :) das macht auch irgendwie mehr spaß als Python aber naja ich mein nachfragen kann man ja immer :)

John W
24-09-2010, 14:16
*HUST* da hat er aber was angestaubtes ausgegraben...


os.system('find /home/thunder-storm -newer /home/thunder-storm/referenzdatei -exec cp -d --parents {} /path/to/backup/dir/ \+')
os.system('"touch /home/thunder-storm/referenzdatei"')

bluecrystal21
24-09-2010, 14:21
LOOOOOOOOOOOOOOl ich idiot hab dein post gelesen un ins falsche Forum geschrieben we blöd bin ich eig schon lol xD
is ja peinlich ... XD

also aber ich kann dann zu tar sagen tar nimm Liste und aus der Liste die Dateien sichern?

bluecrystal21
24-09-2010, 14:25
ahjo John:
hier:
http://forum.ubuntuusers.de/topic/ein-datensicherungs-script-erstellen/ hat Chef dort gefunden.

John W
24-09-2010, 14:28
Man kann tar die Dateien direkt zuschmeißen:


os.system('find /home/thunder-storm -newer /home/thunder-storm/referenzdatei -exec tar -rzf "%s" {} \+' % ziel)
os.system('touch "/home/thunder-storm/referenzdatei"')

bluecrystal21
24-09-2010, 14:34
mh hab syntaxfehler weil das zu lang is wegen einrücken XD

John W
24-09-2010, 14:36
Na, dann kann ich aber auch nix dran machen ;)

bluecrystal21
24-09-2010, 14:36
os.system('find /home/davidlinux -newer /home/davidlinux/DP/dp_clienttask.ini -exec tar -rzf "%s" {} \+' %ziel)
os.system('touch "/home/davidlinux/DP/dp_clienttask.ini"')

xD

bluecrystal21
24-09-2010, 14:38
wo haste das eig reingepackt? bei mir sagt er die komprimierten archive kann er net aktualisieren

bluecrystal21
24-09-2010, 14:44
sag mal wenn ich in ne Datei nen Datum schreib und das mit eienr Variablen auslese
und dann hab ich die Lokalzeit
kann ich die beiden vergleichen?
mein zweites skript is so:

#!/usr/bin/env python
import time
import os
from time import *
lt = localtime()
datei = open ("test.ini","r")
Zeile = datei.readlines()
Zeit=Zeile[1].strip().split(" ")[1]
datei.close()



if not Zeit == lt :
print 'Sicherung wird gestartet'
execfile('/mnt/Freigaben/00-16-17-15-56-61/dp_client.py')
else:
print 'Fehler'
~
~

bluecrystal21
24-09-2010, 14:51
juhu eine Stunde noch dann fahr ich zu meine eltern.jedenfalls wärs cool wenn ich das mit der Sicherung noch hinkrieg ^^

bluecrystal21
24-09-2010, 14:54
import gzip
files = ['file1.txt', 'file2.txt', 'file3.txt']
for f in files:
print 'Compressing file %s' % f
input = open(f, 'rb')
output = gzip.open(f+'.gz', 'wb')
# Copy contents of input file.
while 1:
chunk = input.read(1024)
if chunk == "": break
output.write( chunk )
input.close(); output.close()
print "Done compressing files." das wär doch ne idee oder?

John W
24-09-2010, 14:57
Mit time.time() kannst du die aktuelle Zeit abfragen, dass kann man dann auch vergleichen.
Beim Schreiben und lesen solltest du dann so vorgehen:


import time
datei = open ("lastBackupTime.ini","r")
readtime=int(datei.readline().strip())
datei.close()

if int(time.time()) > readtime:
pass

datei = open ("lastBackupTime.ini","w")
datei.write(int(time.time()))
EDIT: Die Komprimierung sieht ok aus.

bluecrystal21
24-09-2010, 15:03
Naja das musst dir vorstellen du bist Client
du hast ne Datei am server liegen die die ich dir gezeigt hab.
dort kann stehn variable=5D 23.04.2010 das Datum kommt aber vom Server
weil der vom Server sieht wann letztes Backup gemacht wurde. und dieses Datum bis heute die Differenz von da muss ich alle Daten wegsichern von heut bis damals
so als Beispiel deswegen muss ich die Datei auslesen und dann das dort stehende Datum mit aktuellem vergleichen.
bin grad am lesen von tar --help weil ich muss guggen das ich eine Liste mach un die Tar dann nimmt und sagt alles was drin steht sichern,

John W
24-09-2010, 15:04
Das entsprechende tar-Skript hast du ja schon, das Problem ist, dass du nicht an komprimierte Tar-Dateien anhängen kannst - wenn du die Kompression ausschaltest, funktioniert es.

bluecrystal21
24-09-2010, 15:06
jap das weis ich das will chef aber nicht XD
der will das wenn ich von 23.04 ne Sicherung hab das dann alle Daten von Heut bis Damals in nen extra Archiv wandern xD

bluecrystal21
24-09-2010, 15:16
hab grad man-page gelesen da stand was von:

tar :

-N, --newer=DATUM-ODER-DATEI, --after-date=DATUM-ODER-DATEI
nur Dateien ablegen, die neuer als
DATUM-ODER-DATEI sind

vll das ich versuch so irgendwie das zu regeln ^^

bluecrystal21
24-09-2010, 15:37
http://translate.googleusercontent.com/translate_c?hl=de&langpair=en|de&u=http://www.scribd.com/doc/521235/Python-Tutorial-tarfile-module&rurl=translate.google.de&usg=ALkJrhgurf_9hRgKioptraBupVG_Ch6IHQ grad gefunden

bluecrystal21
24-09-2010, 15:58
naja ich mach mich am we mal schlau vll find ich irgendwas raus ich wünsch dir was John :) vielen dank nochma <3

bluecrystal21
25-09-2010, 06:22
heyho John vll könnteste mir doch noch ma helfen ich möcht so ne Liste erstellen für die Sicherung wenn ich das Datum von der anderen Datei hab sagen wir 23.04.2010 wird aus Datei geholt und verglichen mit heutigem Datum so jetz soll er Erst ne Liste machen die alle Daten von 23.04.2010- heut schreibt und die dann evtl der tar übergeben das tar die einpackt? wär doch ne Idee oder?

John W
25-09-2010, 13:00
Wäre es nicht sinnvoller, die Sicherung mit rsync zu erledigen? Da kann man ganz einfach und flott inkrementelle Backups erzeugen, wobei man nur das letzte Backup zurückspielen muss, um den alten Zustand zu haben.

Ansonsten wäre auspacken und vergleichen auch eine Idee, aber der Zeitaufwand dürfte je nach Datenmenge immens wachsen.

bluecrystal21
25-09-2010, 17:09
aber ne möglichkeit gäbe es nicht mit find oder so ne liste zu machen? problem is chef meinte freitags: ja die woche aber net viel geschafft... das hat sich angehört wie wenn ich net da gewesen wär wärs genauso :( macht mich ziemlich fertig der stress den er da macht :( vorallem ich seh derzeit kein land mehr...

John W
25-09-2010, 17:56
Dein Chef gefällt mir immer weniger, was nimmt der sich eig. raus? Keine Ahnung habe naber blöd rumscheißen ist unter aller Würde.

Am einfachsten wäre das Projekt tatsächlich in der Bash zu erledigen, nicht in Python. Ich habe ohnehin keine Ahnung warum es umbedingt Python sein muss, seit den ganzen os.system()-Aufrufen gibt es kein Argument mehr für eine Lösung mittels Python.

Die Dateien lassen sich mittels find problemlos finden, aber das Annehmen der Dateiliste ist in Python einfach unsinnig komplex.

Hiermit kannst du ein neues komprimiertes Archiv anlegen, in dem alle von find gefundenen Dateien gesichert werden:


os.system('find -newer "%s" | tar -czf "%s" -T -', % (refenceFilePath, backupArchivePath))

bluecrystal21
25-09-2010, 18:10
naja john ich weis was du meinst ich hab da auch kein bock mehr aba ich muss einfach v.v

John W
25-09-2010, 18:36
Das soll Teil einer Software werden? o_O

bluecrystal21
25-09-2010, 19:45
mh jedenfalls ich weis nich er meint jaaa des muss gehn und ich kann langsam nemmer -.-

bluecrystal21
26-09-2010, 06:47
hey john hab was gelesen über tar
und mir is da was ins auge gefallen
http://linuxwiki.de/tar#Inkrementelle_Backups wie wäre es wenn ich zuerst ein vollbackup auslöse und dann eine neue Variable schreibe bzw das ganze koopier und das umänder das der code drin ist

#jetzt eine inkrementelle Sicherung
cp /backup/backup.log /backup/backup.log.level1
tar -c -f /backup/inkrementell.tar -g /backup/backup.log.level1 .

und die vollsicherung wäre


#Zuerst eine Vollsicherung:
tar -c -f /backup/vollbackup.tar -g /backup/backup.log .
das ich gleich nen log mach und dann könnte es doch evtl funktionieren oder?

John W
26-09-2010, 12:25
Die Datei hinter -g muss eigentlich nicht gesichert werden, ich würde das in Python dann so lösen:


# Vollbackup
os.system('tar -c -f /home/davidlinux/Backup/Backup%s_0 -g /home/davidlinux/Backup/backup.log "%s"' % (time.strftime('%Y%m%d-%H%M%S'), ' '.join(quellen)))
# inkrementelles Backup
os.system('cp /home/davidlinux/Backup/backup.log /home/davidlinux/Backup/backup.log~ ; tar -c -f /home/davidlinux/Backup/Backup%s_%s.tar -g /home/davidlinux/Backup/backup.log "%s"' % (time.strftime('%Y%m%d-%H%M%S'), zaehler, ' '.join(quellen)))
Das Vollbackup hat das Format Backup<Datum>-<Uhrzeit>_0.tar, die inkrementellen Sicherungen haben das Format Backup<Datum>-<Uhrzeit>_<Zähler> - der Zähler darf nie 0 werden, sonst hast du ein Problem, also mit 1 initialisieren!

EDIT: Zum Zurückspielen alle Backups von 0 bis "geht nicht mehr" entpacken.

bluecrystal21
26-09-2010, 16:18
stimmt evtl werd ichs mal morgen auf arbeit versuchen bin grad dabei meine sachen zu packen und in meine wohnung zu fahren +g+

bluecrystal21
27-09-2010, 08:19
Guten Morgen, :)


#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

#Erzeuge Ordner wenn dieser noch nicht Existiert mit heutigem Datum:
if not os.path.exists(heute):
os.mkdir(heute) # erzeuge das Verzeichnis
print 'Verzeichnis' , heute, 'erfolgreich angelegt'


# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
# inkrementelles Backup
zaehler= 0 +1
os.system('cp /home/davidlinux/backup.log /home/davidlinux/backup.log~ ; tar -c -f /etc/dp/Backup%s_%s.tar -g /home/davidlinux/backup.log "%s"' % (time.strftime('%Y%m%d-%H%M%S'), zaehler, ' '.join(quellen)))



so sieht der eine Teil nun aus, bei Vollsicherung wurde das auch so gelöst.
als ich nur den Ordner DP hatte ging es nun hab es geändert das die komplette home gesichert wird und es kommt folgender Fehler:
python dp_clientt.py
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
tar: Unerwarteter Feldwert in Schnappschussdatei
tar: Nicht behebbarer Fehler: Programmabbruch.

wenn du mir drüber schauen würdest John wär ch dir dankbar auch jedem anderen Poster :)

lg bluecrystal

bluecrystal21
27-09-2010, 08:22
ah hab meinen Fehler entdeckt :)
hab den backup.log gelöscht und nun läufts :)

bluecrystal21
27-09-2010, 08:28
hm das problem is nur er sichert alles was im log is mit rein x.x liegt warscheinlich an dem datum was ich gesetzt hab in der anderen Datei... wobei er mir im log bei der imkrem. sicherung alle Daten reinschreibt x.x.

bluecrystal21
27-09-2010, 08:52
er sichert alles + neue dateien das is noch net ganz das was ich hier machen muss ._.

bluecrystal21
27-09-2010, 09:16
#! /usr/bin/env python
import linecache
import sys, dbus
import os
import time
import subprocess
import re
datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()


if auswahl == 4 :
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()

elif auswahl == 5 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
# inkrementelles Backup
zaehler= 0 +1
os.system('cp /home/davidlinux/backup.log /home/davidlinux/backup.log~ ; tar -c -f /etc/dp/Backup%s_%s.tar -g /home/davidlinux/backup.log "%s"' % (time.strftime('%Y%m%d-%H%M%S'), zaehler, ' '.join(quellen)))

elif auswahl == 2 :
def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

if __name__ == "__main__":
shutdown()


elif auswahl == 3 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'


# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
# Vollbackup
os.system('tar -c -f /etc/dp/Backup%s_0 -g /home/davidlinux/backup.log "%s"' %
(time.strftime('%Y%m%d-%H%M%S'), ' '.join(quellen)))

John W
27-09-2010, 09:18
Aufpassen, dein Zahler ist immer 1! Ich hab das jetzt etwas umgearbeitet, das wird aber vermutlich nicht mehr mit deinem aktuellen Projekt kompatibel sein, da musst du dann umbasteln.
Was ich geändert habe:
- Konfiguration außerhalb der neu eingebauten Schleife (Konfiguration nach oben)
- Zähler korrigiert
- Stündliche Prüfung, ob eine Sicherung stattfinden muss, wenn ja -> durchführen; beim ersten Durchlauf wird ungefragt durchgeführt


import os
import time

#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'

zaehler=1
while True:
heute = time.strftime('%Y%m%d')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

# Erzeuge Ordner wenn dieser noch nicht existiert mit heutigem Datum:
if not os.path.exists('%s%s' % (ziel_verzeichnis, heute)):
os.mkdir('%s%s' % (ziel_verzeichnis, heute)) # erzeuge das Verzeichnis
print 'Verzeichnis %s%s erfolgreich angelegt' % (ziel_verzeichnis, heute)

# Der Name der Tar-Datei:
ziel = '%s%s%s%s.tar' % (ziel_verzeichnis, heute, os.sep, time.strftime('%H%M%S'))

# inkrementelles Backup
os.system('cp /home/davidlinux/backup.log /home/davidlinux/backup.log~ ; tar -c -f /etc/dp/Backup%s_%s.tar -g /home/davidlinux/backup.log "%s"' % (time.strftime('%Y%m%d-%H%M%S'), zaehler, ' '.join(quellen)))
zaehler+=1
# hier den Prozess schlafenlegen:
while heute == time.strftime('%Y%m%d'):
sleep(3600) # eine Stunde warten, dann erneut prüfen, ob sich das Datum geändert hat (Bedingung der while-Schleife)
Mit fällt zudem auf, dass die backup.log im zu sichernden Verzeichnis liegt, das kann Probleme berreiten.

EDIT: Werd mir das aktuelle mal ansehen und zusammenbauen.

bluecrystal21
27-09-2010, 09:23
hab den ort vom log nun geändert was mir auffällt die Sicherungen sind beide ungleich groß das is klar aber wenn ich den log anseh dann seh ich eine Datei die ich geändert hab nicht sondern viele dateien die eig schon im ersten backup(Vollsicherung) gesichert wurden. eig dürfte dort ja nur 1 Datei stehen. wie z.b. hallo.txt aber es stehn mehrere Dort und das is mein noch problemchen danach is aufgabe gelöst

John W
27-09-2010, 09:37
Das ist jetzt eine verbesserte Version ohne Redundanzen, also leichter zu warten:


#!/usr/bin/env python

import linecache
import os
import re
import subprocess
import sys, dbus
import time

# Die Dateien und Verzeichnisse, die gesichert werden sollen:
quellen = ['/home/davidlinux/',]
# Zielverzeichnis für Backups:
ziel_verzeichnis = '/etc/dp/'
# Logdatei liegt wo?
logfile = '%s/Backup.log' % ziel_verzeichnis

zaehler = 1
lastBackup = time.strftime('%Y%m%d')

def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

while True:
datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()
elif auswahl == 2:
shutdown() # soll soweit ich das erkennen kann ausgeführt werden, jedenfalls wurde Shutdown vorher an dieser Stelle definiert

elif auswahl == 3 or auswahl == 5:
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
# Format: /etc/dp/<YYYY><MM><DD>_<zaehler>.tar
if auswahl == 3:
zaehler = 0 # Vollbackup hat Zähler gleich 0
ziel = '%s%s%s%s.tar' % (ziel_verzeichnis, lastBackup, zaehler)
if auswahl == 5: # inkrementelles Backup durchführen
os.system('cp %s %s~ ; tar -c -f %s -g %s %s' % (logfile, logfile, ziel, logfile, ' '.join(quellen)))
else: # Vollbackup durchführen
os.system('tar -cf %s -g %s %s' % (ziel, logfile, ' '.join(quellen)))
zaehler += 1 # Zähler erhöhen; Vollbackup hat immer 0, inkrementelles Backup hat einen Wert größer als 0
while lastBackup == time.strftime('%Y%m%d'):
time.sleep(3600) # eine Stunde schlafen, dann erneut abfragen, was zu tun ist

# Achtung: Darf nicht in die if-elif-Struktur für die Auswahl!
if __name__ == "__main__":
shutdown()

bluecrystal21
27-09-2010, 09:41
das sieht ja mal genial aus und ja shutdown muss auch in die auswahl +grins+ ich versuchs mal danke dir <3 :)

John W
27-09-2010, 09:42
Shutdown wird bei auswahl == 2 ausgeführt.

bluecrystal21
27-09-2010, 09:47
jap stimmt das hast du richtig gesehn. man war das ein quälendes wochenende... .... aber weisste was lol ich hab geträumt von der Lösung XD und es funktionierte un dann bin ich aufgewacht +grml+ un alles war weg -.-.

bluecrystal21
27-09-2010, 09:48
irgendwie passt die codierung nedda zeigt er mir an mh du musst mir die codierung sowieso mal erklären hab da schon ne doku gelesen aber ganz durchgestiegen bin ich nicht.

John W
27-09-2010, 09:50
Das ist wegen Umlauten, hatte ich vergessen, nach der 1. Zeile nur folgende Zeile einfügen, dann geht das:


# -*- coding: UTF-8 -*-

bluecrystal21
27-09-2010, 09:51
was hat das eigentlich damit auf sich ich hab mal gelesen das man python auch für html verwenden kann und man da auch ne kodierung eingeben muss für &Ääuml etc

bluecrystal21
27-09-2010, 09:53
python clienttester.py
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
Traceback (most recent call last):
File "clienttester.py", line 54, in <module>
ziel = '%s%s%s%s.tar' % (ziel_verzeichnis, lastBackup, zaehler)
TypeError: not enough arguments for format string

kam grad als Fehler..

John W
27-09-2010, 10:03
Das sind Kopfdaten für den Browser, damit der das richtig anzeigt; die Zeile die ich gepostet hatte, hat damit nichts zu tun, sondern sagt dem Python-Interpreter nur, dass es sich bei dem Skript um eine UTF-8 kodierte Datei handelt. UTF-8 benutzt teilweise mehr als ein Byte, z.B. bei Umlauten, die 2 Bytes belegen. Auch wenn die nur in den Kommentaren stehen, machen die dem Interpreter Probleme, wenn sie nicht angekündigt sind (kurz: Umlaute = Ohrfeige, der Interpreter duckt sich nur, wenn er weiß, dass er eine übergezogen bekommt ;)).

EDIT: Da ist ein %s zuviel, das hatte ich beim überarbeiten vergessen wegzumachen:


ziel = '%s%s%s.tar' % (ziel_verzeichnis, lastBackup, zaehler)

bluecrystal21
27-09-2010, 10:06
sag mal springt der bei dir auch nicht mehr aus der schleife? bei mir macht er endlos schleife wenn ich #STRG +c drück hm sollte wohl noch break einbauen oder?

John W
27-09-2010, 10:10
Um die Schleife muss noch ein try-except-Block:


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import os
import re
import subprocess
import sys, dbus
import time

# Die Dateien und Verzeichnisse, die gesichert werden sollen:
quellen = ['/home/davidlinux/',]
# Zielverzeichnis für Backups:
ziel_verzeichnis = '/etc/dp/'
# Logdatei liegt wo?
logfile = '%s/Backup.log' % ziel_verzeichnis

zaehler = 1
lastBackup = time.strftime('%Y%m%d')

def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

try:
while True:
datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()
elif auswahl == 2:
shutdown() # soll soweit ich das erkennen kann ausgeführt werden, jedenfalls wurde Shutdown vorher an dieser Stelle definiert

elif auswahl == 3 or auswahl == 5:
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
# Format: /etc/dp/<YYYY><MM><DD>_<zaehler>.tar
if auswahl == 3:
zaehler = 0 # Vollbackup hat Zähler gleich 0
ziel = '%s%s%s.tar' % (ziel_verzeichnis, lastBackup, zaehler)
if auswahl == 5: # inkrementelles Backup durchführen
os.system('cp %s %s~ ; tar -c -f %s -g %s %s' % (logfile, logfile, ziel, logfile, ' '.join(quellen)))
else: # Vollbackup durchführen
os.system('tar -cf %s -g %s %s' % (ziel, logfile, ' '.join(quellen)))
zaehler += 1 # Zähler erhöhen; Vollbackup hat immer 0, inkrementelles Backup hat einen Wert größer als 0
while lastBackup == time.strftime('%Y%m%d'):
time.sleep(3600) # eine Stunde schlafen, dann erneut abfragen, was zu tun ist
except KeyboardInterrupt:
print "Beendet."

# Achtung: Darf nicht in die if-elif-Struktur für die Auswahl!
if __name__ == "__main__":
shutdown()

bluecrystal21
27-09-2010, 10:14
naja braucht man sleep unbedingt? weil wenn sich doch die daten ändern dann sagt er doch: ah du bist neu auch gleich sichern???
die alte Schleife hat gut funktioniert das Problem war nur mit dem tar
mein Gott da is son scheiss Auto vor der Tür und duddelt immer dieselbe
Musik immer AAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAHAAAAAAAAAA nervt ey ^^
anstatt python sollte der ne Ohrfeige mitkriegen lol aber Danke für die Erklärung nun hab ich das auch verstanden. :)

John W
27-09-2010, 10:21
Ohne sleep wird das Python-Skript nach jedem Durchlauf sofort wieder sichern, ich denke nicht, dass das der Sinn ist, da man ansonsten das Skript beenden müsste (schluckt sonst sämtliche CPU-Leistung), wodurch der Zähler aber nicht mehr nutzbar ist - wenn der Server sagt, dass sich eine Datei geändert hat, ist das auch kein Problem, sofern du dafür sorgst, dass wenn sich nichts geändert hat, das Skript einfach nur eine gewisse Zeit wartet.
Da müsstest du dann allerdings etwas genauer erklären, wann der Server welche Meldung ausspuckt, zur Zeit wird einmal täglich eine inkrementelle Sicherung oder eine Vollsicherung gemacht, je nachdem, ob der Server 5 oder 3 in die Datei schreibt, wobei stündlich geprüft wird, ob sich das Datum geändert hat.
Uhrzeiten werden vom Skript nicht mehr berücksichtigt, da dies ein Problem mit dem Zähler darstellen könnte, das Datum lässt dich aber über das Änderungsdatum der jeweiligen tar-Datei herausfinden.

Ich muss jetzt aber erstmal wieder zur Schule, werde hier vermutlich gegen 3 wieder nachsehen.

bluecrystal21
27-09-2010, 10:24
naja es wird halt mit dem Skript nicht täglich gesichert sondern von nen gewissen datum wie montag vor 3 wochen bis heute das kann 4 wochen oder 3 Monate sein aber ich bin dir echt sooo Dankbar ich kanns dir garnet Sagen :) bis später und pass auf dich auf. :)

bluecrystal21
27-09-2010, 12:08
also ich hab das alte Skript mal so gelassen wie es is und hab gesehn das er immer wieder alle verpackt kann ich das irgendwie dazu bringen das er erst den alten log liest und dann die Dateien auswählt?
wäre ne geile Lösung und wäre perfekt so
lg
bluecrystal21

bluecrystal21
27-09-2010, 13:09
ok egal ob wir nun tar nehmen oder net es muss eine imkrementielle sicherung werden. hast ne idee ausser tar? danke für deine Hilfe John.

lg
bluecrystal

John W
27-09-2010, 14:27
Mit rsync ist das ganz einfach, dabei wird die Ordnerstruktur komplett übernommen:
rsync -aoAEHX quellen ziel

Durch -a und -o werden rekursiv alle Dateien und Ordner kopiert, des Weiteren werden:
- Symlinks und Gerätedateien und als solche einfach übernommen
- und Berechtigungen, Eigentümer, Gruppen und Änderungszeiten mitkopiert

-A speichert ACLs
-E behält die Ausführbarkeit von Dateien bei
-H erkennt Hardlinks, sodass eine Datei mit 5 Hardlinks einmal kopiert wird, aber 5 mal als Hardlink verfügbar ist -> gleiches Verhalten wie in der Quelle
-X speichert erweiterte Attribute

Damit wird ein Vollbackup erstellt, um jetzt ein inkrementelles Backup zu erzeugen, übergibt man zusätzlich den Parameter --link-dest=<verzeichnis>, wobei <verzeichnis> das Verzeichnis mit dem letzten Backup ist - das ist etwas umständlich, unten ist ein Beispiel.

Wichtig ist, dass bei den Quellen am Ende kein Slash steht, da z.B. bei rsync -a /etc/test /backup hinterher das Verzeichnis /backup/test vorliegt, bei rsync -a /etc/test/ /backup jedoch alle Dateien und Verzeichnisse in /etc/test/ direkt in /backup/ kopiert wurden.
Der Slash entscheidet also, ob der Basisname der Quelle als Unterordner im Ziel erstellt wird oder nicht.

Also hier als Beispiel:


# 1.Tag:
# 1. Vollbackup nach /etc/dp/20100927/
rsync -aoAEHX /home/davidlinux/ /etc/dp/20100927/
# 2. Tag
# 1. inkrementelle Sicherung; mittels "rsync -aoAEHX /etc/dp/20100928/ /home/davidlinux/" lässt sich dieses Backup wiederherstellen
rsync -aoAEHX /home/davidlinux/ --link-dest=/etc/dp/20100927/ /etc/dp/20100928/
# 3. Tag
# 2. inkrementelle Sicherung; mittels "rsync -aoAEHX /etc/dp/20100929/ /home/davidlinux/" lässt sich dieses Backup wiederherstellen
rsync -aoAEHX /home/davidlinux/ --link-dest=/etc/dp/20100928/ /etc/dp/20100929/
# 4. Tag
# 2. Vollbackup
rsync -aoAEHX /home/davidlinux/ /etc/dp/20100930/
# 5. Tag
# 1. inkrementelle Sicherung vom 2. Vollbackup
rsync -aoAEHX /home/davidlinux/ --link-dest=/etc/dp/20100929/ /etc/dp/20100930/
Man übergibt am besten immer absolute Pfade, sonst kann es zu Problemen mit link-dest kommen.
Es kann täglich ein Backup erstellt werden, wobei die inkrementellen Sicherungen praktisch auch Vollbackups sind, da alle Daten vorhanden sind - wenn man z.B. das 1. Vollbackup löscht, kann man trotzdem die inkrementellen Sicherungen zurückspielen, da dank Hardlinks die Daten weiterhin verfügbar sind.

Teste das ganze am besten erstmal in einer Testumgebung, da bekommt man ein besseres Gefühl für rsync, insbesondere mit Hardlinks solltest du vorher etwas rumspielen, da die Backups darauf basieren.

bluecrystal21
27-09-2010, 14:30
aber das kann man in Python implementieren

bluecrystal21
27-09-2010, 14:40
implementieren in python muss ichs können muss aba net unbedingt TAR ausführen deswegen frag ich ^^

John W
27-09-2010, 14:50
Sicher, du musst nur das Datum der letzten Sicherung haben, dann kannst du das so machen:


os.system('rsync -aoAEHX /home/davidlinux/ --link-dest=/etc/dp/%s/ /etc/dp/%s/' % (lastBackupDate, strftime('%Y%m%d')))
lastBackupDate=time.strftime("%Y%M%D")
Vollbackup ist dann ganz einfach:


os.system('rsync -aoAEHX /home/davidlinux/ /etc/dp/%s/' % (strftime('%Y%m%d')))
lastBackupDate=time.strftime("%Y%M%D")
Damit sähe der Code so aus:


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import os
import re
import subprocess
import sys, dbus
import time

# Die Dateien und Verzeichnisse, die gesichert werden sollen:
quellen = ['/home/davidlinux/',]
# Zielverzeichnis für Backups:
ziel_verzeichnis = '/etc/dp/'

lastBackup = time.strftime('%Y%m%d')

def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

try:
while True:
datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()
elif auswahl == 2:
shutdown()

elif auswahl == 3 or auswahl == 5:
print 'Sicherung wird gestartet und unter %s/ gespeichert' % ziel_verzeichnis
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
if auswahl == 5: # inkrementelles Backup durchführen
os.system('rsync -aoAEHX %s --link-dest=%s/%s/ %s/%s/' % (' '.join(quellen), ziel_verzeichnis, lastBackup, ziel_verzeichnis, time.strftime('%Y%m%d')))
else: # Vollbackup durchführen
os.system('rsync -aoAEHX %s %s/%s/' % (' '.join(quellen), ziel_verzeichnis, time.strftime('%Y%m%d')))
lastBackup=time.strftime("%Y%M%D")
while lastBackup == time.strftime('%Y%m%d'):
time.sleep(3600) # eine Stunde schlafen, dann erneut abfragen, was zu tun ist, sofern dich das Datum geändert hat
except KeyboardInterrupt:
print "Beendet."

# Achtung: Darf nicht in die if-elif-Struktur für die Auswahl!
if __name__ == "__main__":
shutdown()
Ich hoffe mal, dass ich jetzt keinen Fehler im Code hab.

bluecrystal21
27-09-2010, 14:54
File "dp_client.py", line 42
os.system('rsync -aoAEHX %s --link-dest=%s/%s/ %s/%s/' % (' '.join(quellen), ziel_verzeichnis,lastBackup, ziel_verzeichnis, strftime('%Y%m%d')))
^
IndentationError: unindent does not match any outer indentation level
naja er zeigt an bei der letzten ) gehts nich

John W
27-09-2010, 14:59
Da hast du was nicht ganz richtig eingerückt, hast du vielleicht ein Leerzeichen zuviel/zuwenig?

bluecrystal21
27-09-2010, 15:01
ich hab jetz deins kopiert und dann is er runtergefahren lol ^^
naja ich habs jetz noch geändert und...

Sicherung wird gestartet und unter /etc/dp// gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
Traceback (most recent call last):
File "dp_clienttester.py", line 52, in <module>
os.system('rsync -aoAEHX %s %s/%s/' % (' '.join(quellen), ziel_verzeichnis, strftime('%Y%m%d')))
NameError: name 'strftime' is not defined

bluecrystal21
27-09-2010, 15:02
zaehler = 1
lastBackup = time.strftime('%Y%m%d')

#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
#inkrementelles Backup
# zaehler+=1
# os.system('find /home/davidlinux -newer /home/davidlinux/ -exec cp -d --parents {} /etc/dp/backup.log \+')
# os.system('cp /etc/dp/backup.log /etc/dp/backup.log1 ; tar -c -f /etc/dp/Backup%s_%s.tar'
# '-g /etc/dp/backup.log "%s"' % (time.strftime('%Y%m%d-%H%M%S'), zaehler, ' '.join(quellen)))
os.system('rsync -aoAEHX %s --link-dest=%s/%s/ %s/%s/'%(' '.join(quellen), ziel_verzeichnis,lastBackup,ziel_verzeichnis, strftime('%Y%m%d')))
da der eine teil von meinen eigenen skript noch ^^ hab die anderen auskommentiert und dein os rein und da zeigts den fehler

John W
27-09-2010, 15:03
Hab den Fehler auch grad erst entdeckt, es muss time.strftime heißen, hab das im vorigen Posting korrigiert.

EDIT: Das mixen der beiden Skripte könnte zu Problemen führen, halt die nach Möglichkeit erstmal getrennt.

bluecrystal21
27-09-2010, 15:10
gut also bei deinem bin ich in endlosschleife und komm auch mit strg und c nicht raus

bluecrystal21
27-09-2010, 15:23
das shutdown muss man aber in die if bauen sonst macht es sofort herunterfahren ^^

John W
27-09-2010, 15:24
Python ist zu flott, hab hier mal eine kleine Pause am Ende der Schleife eingebaut, sodass Python bei der Pause beendet werden kann (vorher startete der neue rsync-Prozess zu schnell, der dann anstelle von Python beendet wurde):


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import os
import re
import subprocess
import sys, dbus
import time

# Die Dateien und Verzeichnisse, die gesichert werden sollen:
quellen = ['/home/davidlinux/',]
# Zielverzeichnis für Backups:
ziel_verzeichnis = '/etc/dp/'

lastBackup = time.strftime('%Y%m%d')

def shutdown():
bus = dbus.SystemBus()
try:
remote_object = bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
except dbus.exceptions.DBusException, e:
print e

try:
while True:
datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","5")
outfile.write(line)
print line
outfile.close()
elif auswahl == 2:
shutdown()

elif auswahl == 3 or auswahl == 5:
print 'Sicherung wird gestartet und unter %s/ gespeichert' % ziel_verzeichnis
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
if auswahl == 5: # inkrementelles Backup durchführen
os.system('rsync -aoAEHX %s --link-dest=%s/%s/ %s/%s/' % (' '.join(quellen), ziel_verzeichnis, lastBackup, ziel_verzeichnis, time.strftime('%Y%m%d')))
else: # Vollbackup durchführen
os.system('rsync -aoAEHX %s %s/%s/' % (' '.join(quellen), ziel_verzeichnis, time.strftime('%Y%m%d')))
lastBackup=time.strftime("%Y%M%D")
while lastBackup == time.strftime('%Y%m%d'):
time.sleep(3600) # eine Stunde schlafen, dann erneut abfragen, was zu tun ist, sofern dich das Datum geändert hat
time.sleep(1)
except KeyboardInterrupt:
print "Beendet."
Shutdown hatte ich auch gerade - kam etwas unerwartet, hätte auch nicht passieren dürfen; ich vermute, dass es an der if __name__ == "__main__"-Struktur liegt, hab die deshalb mal rausgenommen (die Bedingung wird wahr, wenn man das Skript interaktiv ausführt; bin da aber jetzt erst drauf gekommen, dass der Sinn wohl nicht darin bestand, dass das Skript dann den Rechner runterfährt)

bluecrystal21
27-09-2010, 15:29
studierst du eig informatik? naja Bildschirm gibt er mir nix mehr aus kein plan ich kriegs nich hin die sicherung jedes mal passt was nich ich denk irgendwann sieht das chef auch und es bleibt so wies is oder kp er küdnigt mich kann auch sein.....

bluecrystal21
27-09-2010, 15:32
richtig er soll shutdown ausführen wenn die variable 2 ist nicht nachdem er was ausgeführt hat. Jedenfalls das shutdown gehört in die if Anweisung mit dazu =)

John W
27-09-2010, 15:33
Noch geh ich zur Schule, Stufe 12.

Poste mal die Ausgaben, damit kann ich mehr anfangen als mit "passt was nich" ;-)
Kopf hoch, wird schon klappen.

John W
27-09-2010, 15:34
richtig er soll shutdown ausführen wenn die variable 2 ist nicht nachdem er was ausgeführt hat. Jedenfalls das shutdown gehört in die if Anweisung mit dazu =)
Trifft ja jetzt zu (Code hatte ich ja geändert).

bluecrystal21
27-09-2010, 15:39
naja ich bin nur meisterin in betriebsinformatik aber Python hatt ich nicht gelernt un das mit 21.. Naja wie dem auch sei.
also die JETZIGE Aufgabe meines Chefs:
erstell ein imkrementielles Backup das eine Liste mit Dateien Durchsucht, diese ausliest welche Daten neu hinzugekommen sind von irgendeinem Datum (erstmal nur zu sehn das es funktioniert später wird das ganze aus einer Datei ausgelesen das vom Administrator am Server bestimmt wird) und sichere von heute bis Dato
deswegen hab ich 2 Dateien *hehe* die ich öffne und da hol ich die Variable auswahl her derzeit ists auch so ich hab nen Datum einfach so mal festgelegt aber ich muss erstma nen log einer Vollsicherung machen dann mach ich so 2-3 txt Dateien diese füg ich dann einfach hinzu und mit den 2-3 Daten erstma ne imkrementielle Sicherung. Später sind das mehr Daten durch Benutzer und deswegen versuch ichs erstma so hinzukriegen da es später eh auf größere Zeiträume ausgelegt wird und dann eh nen log hinterlegt wird. Das is meine jetzige Aufgabe und ich muss sagen ich bin kurz davor Amok zu laufen ^^.

John W
27-09-2010, 15:47
Die aufgabe ist iwie merkwürdig; geht es sich jetzt um Backup oder darum, Dateien zu finden, die in einem bestimmten Zeitraum (Datum x bis heute) bearbeitet wurden? Ersteres haben wir ja schon mit tar und jetzt mit rsync, wobei irgendwas wohl nie gepasst hatte (wobei ich auch nicht dahinterkomme was nicht passte).
Letzteres ist mit der find-tar-Methode machen, wobei wir eine Referenzdatei erstellen und das Änderungsdatum einfach auf die angegebene Zeit setzen.
Damit wäre die Aufgabe auf beide Arten gelöst.

bluecrystal21
27-09-2010, 15:48
es geht um eine Sicherung Definitiv. vll sollten wir mal Telen da könnt ichs besser erklären naja hab in 12 minuten Feierabend -.-
es passte definitiv nicht wenn ich die tar die ich imkrementiel verpackt hab das er alle daten anzeigt? ich hab nur eine txt geschrieben und er zeigt 22 mb an is doch merkwürdig deswegen hab ich tar -tvf dateiname.tar aufgerufen und gesehn er speichert die komplette home-partition nochmals.

John W
27-09-2010, 15:54
os.system('touch /tmp/reference -d "%s" ; find -newer "/tmp/reference" | tar -czf "%s" -T -', % (datum, ziel_verzeichnis))

datum hat dabei folgendes Format: YYYY/MM/DD

bluecrystal21
27-09-2010, 15:56
hm ich werds mal versuchen hab auch grad was gefunden wie...


http://www.wer-weiss-was.de/theme26/article1725978.html
$ tar --newer=./lastbackup


vll das irgendwie einbauen und lastbackup= backup.log

John W
27-09-2010, 15:58
Dann kannst du auch gleich die letzte tar-Datei nehmen, dann kannst du dir die backup.log sogar ganz sparen; Problem gelöst?

bluecrystal21
27-09-2010, 16:00
mit dem tar --newer meinst du?
os.system('tar --newer=/etc/dp/datei.tar')
os.system('tar -cvf verzeichnis') oder wir schreiben wenn ich in meiner Wohnung bin in 20 Minuten Weiter wenn du willst ^^

John W
27-09-2010, 16:02
Ein Aufruf:

os.system('tar --newer=/etc/dp/datei.tar -cvf /etc/dp/neuetar.tar verzeichnis')

bluecrystal21
27-09-2010, 16:57
ah okay und wofür steht dort hinten verzeichnis?

John W
27-09-2010, 16:59
Das ist das Verzeichnis, in dem die zu sichernden Daten liegen.

bluecrystal21
27-09-2010, 17:02
also quasi home partition ^^

John W
27-09-2010, 17:04
jop
123456789

bluecrystal21
27-09-2010, 17:24
ok cool danke =)

bluecrystal21
28-09-2010, 07:29
so John habs ausprobiert mit einer schon existierenden Datei
raus kommt folgendes:

python dp_client.py
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
tar: /etc/dp/Backup20100927-140837_0.tar: Kann stat nicht ausführen: Datei oder Verzeichnis nicht gefunden
tar: Datumsdatei nicht gefunden
„tar --help“ oder „tar --usage“ gibt weitere Informationen.


eingefügter code :

os.system('tar --newer=/etc/dp/Backup20100927-140837_0.tar -cvf /etc/dp/Backup20100927-140837_1.tar /home/davidlinux/')
wollt einfach nur zum Testen eingeben muss danach eh lastbackup reinstellen und neue Tar wird dann anders gemacht mit ziel+zähler oder so.

ich frag mich wo mein Fehler liegt x.x.
lg
bluecrystal21

John W
28-09-2010, 09:06
Die alte Tar-Datei existiert nicht, du hast die Uhrzeit in den Namen genommen, die ist aber immer anders - du musst die Uhrzeit vor dem erstellen des tar-Archivs abfragen, speichern, den gespeicherten Wert für den Dateinamen verwenden und für den nächsten Durchlauf beibehalten; dass sähe dann z.B. so aus:


# alte Zeit und altesDatum muss bereits bekannt sein, erstmalig werden sie beim Vollbackup gesetzt

# Zeit und Datum für neues Archiv abfragen:
neuesDatum=time.strftime('%Y%m%d')
neueZeit=time.strftime('%H%M%S')

# Archiv erstellen, dabei nur Dateien berücksichtigen, die nach dem letzten Backup geändert/erstellt wurden:
os.system('tar --newer=/etc/dp/Backup%s-%s_%s.tar -cvf /etc/dp/Backup%s-%s_%s.tar /home/davidlinux/' % (altesDatum, alteZeit, zaehler, neuesDatum, neueZeit, zaehler+1))

# jetzt erst den Zähler erhöhen:
zaehler+=1

# Für den nächsten Durchlauf das aktuelle Backup als letztes Backup festlegen:
altesDatum=neuesDatum
alteZeit=neueZeit

bluecrystal21
28-09-2010, 09:11
na guten Morgen auch schon ausgeschlafen? =)
python dp_client.py
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
Traceback (most recent call last):
File "dp_client.py", line 46, in <module>
os.system('tar --newer=/etc/dp/Backup%s-%s_%s.tar -cvf /etc/dp/Backup%s-%s_%s.tar /home/davidlinux/' % (altesDatum, alteZeit, zaehler, neuesDatum, neueZeit, zaehler+1))
NameError: name 'altesDatum' is not defined


ausgabe ^^

bluecrystal21
28-09-2010, 09:12
ach jetz hab ichs gesehn ich muss ja erst das alte abfragen bevor der das neue machen kann oder lieg ich da falsch?

bluecrystal21
28-09-2010, 09:15
ich muss es gleich so bauen das das Datum aus der Datei geholt wird, derzeit ists so mom:


#!/usr/bin/env python
import time
import os
from time import *
lt = localtime()
datei = open ("test.ini","r")
Zeile = datei.readlines()
Zeit=Zeile[1].strip().split(" ")[1]
datei.close()



if not Zeit == lt :
print 'Sicherung wird gestartet'
execfile('/mnt/Freigaben/00-16-17-15-56-61/dp_client.py')
else:
print 'Fehler'

wenn ich nen Datum hinter dem boottime=7D 24.04.2010 hab vergleicht er es mit dem heutigen und dann muss er von heut bis zum 24.04.2010 sichern also muss ich eig das Datum aus ner Datei holen bzw vom letzten Backup was z.b. am 24.04.2010 statt fand

John W
28-09-2010, 09:17
Hab ja gesagt: Muss schon bekannt sein; hier ein kleiner Hack, bei dem die Datei nicht bekannt sein muss:


datei_liste=os.listdir('/%s' % ziel_verzeichnis)
i=0
while i < len(datei_liste):
if datei_liste[i].endswith('.tar'):
i+=1
else:
datei_liste.pop(i)
if len(datei_liste):
datei_liste.sort()
os.system('tar --newer=/%s/%s -cvf /%s/Backup%s-%s_%s.tar /home/davidlinux/' % (ziel_verzeichnis, datei_liste[-1], ziel_verzeichnis, time.strftime('%Y%m%d'), time.strftime('%H%M%S'), zaehler)
zaehler+=1
else:
print "Fehler: Kein vorheriges Backup!"

bluecrystal21
28-09-2010, 09:20
dh. quasi ich muss zuerst Datei sortieren und dann sagen du bist letzte ab da sichern? & wenn ich lastbackup die Datei reinknall dh. lastbackup= backupsblalba.tar?

John W
28-09-2010, 09:22
Jop, genau das macht der Code.

bluecrystal21
28-09-2010, 09:26
elif auswahl == 0 :
zaehler+=1
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
datei_liste=os.listdir('/%s' % '/etc/dp/')
i=0
while i < len(datei_liste):
if datei_liste[i].endswith('.tar'):
i+=1
else:
datei_liste.pop(i)
if len(datei_liste):
datei_liste.sort()
os.system('tar --newer=/%s/%s -cvf /%s/Backup%s-%s_%s.tar /home/davidlinux/' % (ziel_verzeichnis, datei_liste[-1], ziel_verzeichnis, time.strftime('%Y%m%d'), time.strftime('%H%M%S'), zaehler)

else:
print "Fehler: Kein vorheriges Backup!"


so sieht der eine Teil nun aus, ABER
ausgabe:
python dp_client.py
File "dp_client.py", line 63
else:
^
SyntaxError: invalid syntax

John W
28-09-2010, 09:35
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
elif auswahl == 0:
zaehler+=1
# Die Dateien und Verzeichnisse, die gesichert werden sollen,

print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

# Der Name der Tar-Datei:
datei_liste=os.listdir('/%s' % ziel_verzeichnis)
i=0
while i < len(datei_liste):
if datei_liste[i].endswith('.tar'):
i+=1
else:
datei_liste.pop(i)
if len(datei_liste):
datei_liste.sort()
print 'tar --newer=/%s/%s -cvf /%s/Backup%s-%s_%s.tar %s' % (ziel_verzeichnis, datei_liste[-1], ziel_verzeichnis, time.strftime('%Y%m%d'), time.strftime('%H%M%S'), zaehler, ' '.join(quellen))
else:
print "Fehler: Kein vorheriges Backup!"
Ich denk mal ich hab das so richtig eingerückt.

PS: Nutz bitte Variablen, fest reingeschriebene Werte (insbesondere Pfade) sind immer schlecht, da man erst umständlich danach suchen muss - und wenn man mal einen Pfad ändern will, hat man Arbeit. ;)

bluecrystal21
28-09-2010, 09:41
Habs nun kopiert und immer das else: hatn fehler bei Zeile 47
Mom:


#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import sys, dbus
import os
import time
import subprocess
import re
datei = open ("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()


if auswahl == 4 :
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","0")
outfile.write(line)
print line
outfile.close()

elif auswahl == 0 :
zaehler+=1
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'
heute = ziel_verzeichnis + time.strftime('%Y%m%d')
jetzt = time.strftime('%H%M%S')
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
ziel = heute + os.sep + jetzt + '.tar'
datei_liste=os.listdir('/%s' % ziel_verzeichnis)
i=0
while i < len(datei_liste):
if datei_liste[i].endswith('.tar'):
i+=1
else:
datei_liste.pop(i)
if len(datei_liste):
datei_liste.sort()
os.system('tar --newer=/%s/%s -cvf /%s/Backup%s-%s_%s.tar %s' % (ziel_verzeichnis, datei_liste[-1], ziel_verzeichnis, time.strftime('%Y%m%d'), time.strftime('%H%M%S'), zaehler, ' '.join(quellen))
else:
print "Fehler: Kein vorheriges Backup!"
#elif auswahl == 2 :
# def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
# if __name__ == "__main__":
# shutdown()
#elif auswahl == 3 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
# quellen = ['/home/davidlinux/',]
# ziel_verzeichnis = '/etc/dp/'
# heute = ziel_verzeichnis + time.strftime('%Y%m%d')
# jetzt = time.strftime('%H%M%S')
# print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
# print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

## Der Name der Tar:
# ziel = heute + os.sep + jetzt + '.tar'
# Vollbackup
# os.system('tar -c -f /etc/dp/Backup%s_0 -g /home/davidlinux/backup.log "%s"' %
# (time.strftime('%Y%m%d-%H%M%S'), ' '.join(quellen)))

Wann musste denn heut wieder Schule?

hab den rest erstmal auskommentiert kann man später wieder Reinmachen

John W
28-09-2010, 09:45
Hab nur noch ne Stunde Deutsch, mein Hassfach -.-



#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import sys, dbus
import os
import time
import subprocess
import re

# Konfiguration nach oben:
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'

datei = open("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","0")
outfile.write(line)
print line
outfile.close()

elif auswahl == 0:
zaehler+=1
# Die Dateien und Verzeichnisse, die gesichert werden sollen,
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
datei_liste=os.listdir('/%s' % ziel_verzeichnis)
i=0
while i < len(datei_liste):
if datei_liste[i].endswith('.tar'):
i+=1
else:
datei_liste.pop(i)
if len(datei_liste):
datei_liste.sort()
os.system('tar --newer=/%s/%s -cvf /%s/Backup%s-%s_%s.tar %s' % (ziel_verzeichnis, datei_liste[-1], ziel_verzeichnis, time.strftime('%Y%m%d'), time.strftime('%H%M%S'), zaehler, ' '.join(quellen)))
else:
print "Fehler: Kein vorheriges Backup!"
#elif auswahl == 2 :
# def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
# if __name__ == "__main__":
# shutdown()
#elif auswahl == 3 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
# quellen = ['/home/davidlinux/',]
# ziel_verzeichnis = '/etc/dp/'
# heute = ziel_verzeichnis + time.strftime('%Y%m%d')
# jetzt = time.strftime('%H%M%S')
# print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
# print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

## Der Name der Tar:
# ziel = heute + os.sep + jetzt + '.tar'
# Vollbackup
# os.system('tar -c -f /etc/dp/Backup%s_0 -g /home/davidlinux/backup.log "%s"' %
# (time.strftime('%Y%m%d-%H%M%S'), ' '.join(quellen)))

bluecrystal21
28-09-2010, 09:51
jaaaaaaaaaaaa da habn wir definitiv was gemeinsam ich habs auch gehasst so das ich das Buch damals an den Tisch geknallt hab aufgestanden bin und gegangen bin ^^.
Fehlermeldung bei deinem Code:
python dp_testclient2.py
Traceback (most recent call last):
File "dp_testclient2.py", line 31, in <module>
zaehler+=1
NameError: name 'zaehler' is not defined

ach mich regt die Programmierung nur noch auf vorallem Chef fragt alle Stunden nach mit was is jetz etc -.-

John W
28-09-2010, 09:54
Der Zähler ist irgendwo flöten gegangen, schmeißen wir ihn ganz raus und nehmen stattdessen nur die Zeit:


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import linecache
import sys, dbus
import os
import time
import subprocess
import re

# Konfiguration nach oben:
quellen = ['/home/davidlinux/',]
ziel_verzeichnis = '/etc/dp/'

datei = open("dp_clienttask.ini","r")
lines = datei.readlines()
for line in lines:
if line.lower().strip().startswith("boottime="):
auswahl=int(re.split('^boottime=([0-9]+)[^0-9]*?$', line.lower().strip())[1])
datei.close()

if auswahl == 4:
outfile=open("dp_clienttask.ini","w+")
for line in open("dp_clienttasktemp.ini"):
line=line.replace ("X","0")
outfile.write(line)
print line
outfile.close()

elif auswahl == 0:
# Die Dateien und Verzeichnisse, die gesichert werden sollen,
print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'
# Der Name der Tar-Datei:
datei_liste=os.listdir('/%s' % ziel_verzeichnis)
i=0
while i < len(datei_liste):
if datei_liste[i].endswith('.tar'):
i+=1
else:
datei_liste.pop(i)
if len(datei_liste):
datei_liste.sort()
os.system('tar --newer=/%s/%s -cvf /%s/Backup%s-%s.tar %s' % (ziel_verzeichnis, datei_liste[-1], ziel_verzeichnis, time.strftime('%Y%m%d'), time.strftime('%H%M%S'), ' '.join(quellen)))
else:
print "Fehler: Kein vorheriges Backup!"
#elif auswahl == 2 :
# def shutdown():
# bus = dbus.SystemBus()
# try:
# remote_object = bus.get_object('org.freedesktop.Hal',
# '/org/freedesktop/Hal/devices/computer')
# props = remote_object.Shutdown(dbus_interface='org.freedes ktop.Hal.Device.SystemPowerManagement')
# except dbus.exceptions.DBusException, e:
# print e
# if __name__ == "__main__":
# shutdown()
#elif auswahl == 3 :
#Die Dateien und Verzeichnisse, die gesichert werden sollen,
# quellen = ['/home/davidlinux/',]
# ziel_verzeichnis = '/etc/dp/'
# heute = ziel_verzeichnis + time.strftime('%Y%m%d')
# jetzt = time.strftime('%H%M%S')
# print 'Sicherung wird gestartet und unter /etc/dp/ gespeichert'
# print 'Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen'

## Der Name der Tar:
# ziel = heute + os.sep + jetzt + '.tar'
# Vollbackup
# os.system('tar -c -f /etc/dp/Backup%s_0 -g /home/davidlinux/backup.log "%s"' %
# (time.strftime('%Y%m%d-%H%M%S'), ' '.join(quellen)))

bluecrystal21
28-09-2010, 10:02
Fuck er gibt mir aus:

python dp_testclient2.py
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
Fehler: Kein vorheriges Backup!

x.x

John W
28-09-2010, 10:05
Mach mal aus "datei_liste.pop(i)" "print datei_liste.pop(i)", dann siehst du, welche Dateien er sonst benutzen könnte, vl. stimmt was mit dem Filter nicht.

bluecrystal21
28-09-2010, 10:08
ja ok er gibt mir den backup.log aus aber der log is nicht mehr aktuell weil die letzte vollsicherung ohne log. gemacht wurde dh die Datei gibts mit _0 dran aber keinen log dazu.

John W
28-09-2010, 10:09
Dann ist soweit alles OK, du musst nur einmalig eine Vollsicherung machen, dann arbeitet das Skript wie es soll.

bluecrystal21
28-09-2010, 10:11
ja schon aber, er aktualisiert den log nicht.
hab grad Vollsicherung reingeknallt und er sagt trotzdem: kein Backup vorhanden. also der Log ist von 8 uhr noch was aber aktualisiert is er nich da hab ich iwas zerschossen beim log.

John W
28-09-2010, 10:14
Log-Datei brauchst du ja nicht mehr, das Skript arbeitet über die Änderungszeiten. Du bracuhst nur das letzte Vollbackup+alle folgenden inkrementellen Backups, wobei nur das letzte Backup für das Skript relevant ist, der Rest wird nur zum Wiederherstellen aus dem Backup benötigt.

bluecrystal21
28-09-2010, 10:16
dann passt aber der filter nicht ganz denn der müsste mir das vollsicherungs-backup ausgeben aber er gibt backup.log aus.

bluecrystal21
28-09-2010, 10:20
haste eig um 12.30 noch zeit? weil mein Arbeitskollege drängelt das er in Mittag will weil wir zum Lidl fahren müssen mit meinem Auto -.-"" und dann einkaufen +augen roll+ nur weil er so verfressen isch ^^ naja lehrling halt xD

bluecrystal21
28-09-2010, 10:26
python dp_testclient2.py
Sicherung wird gestartet und unter /etc/dp/ gespeichert
Druecken Sie 2Mal STRG + C um die Sicherung abzubrechen
backup.log
Fehler: Kein vorheriges Backup!

dort sollte er doch eig Backups mit datum uhrzeit_0 ausgeben oder lieg ich da falsch?