Dienstag, 9. Februar 2010, 10:43 UTC+1

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Apensiv

Profi

Beiträge: 917

Distribution: Andere

Andere Distribution: Debian

Version: 5.0

Desktop: GNOME

Architektur: 32-Bit PC

21

Mittwoch, 7. November 2007, 20:59

Moin moin,

so nun habe ich ein Problem, denn folgender Code-Teil
ergibt eine Fehlermeldung:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
if (-"backupconf"){
    my @Dateien;
    open(CONFIG"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
    while(<CONFIG>){
              push(@Dateien,$_); }
    close(CONFIG);
    $data = @Dateien["0"];
    if ($data){
        copy($data"$backup_medium/backup/");}}
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");


ergibt diese Fehlermeldung:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
apensiv@apensiv:~/Perl/Projekte$ ./backup.pl
Unsuccessful stat on filename containing newline at /usr/share/perl/5.8/File/Copy.pm line 85.
Unsuccessful stat on filename containing newline at /usr/share/perl/5.8/File/Copy.pm line 95.
Unsuccessful open on filename containing newline at /usr/share/perl/5.8/File/Copy.pm line 122.
backup/
backup/bookmarks.html
backup/fstab
backup/xorg.conf
backup/ubuntu-files
backup/sources.list
backup/smb.conf
Backup erfolgreich erstellt
apensiv@apensiv:~/Perl/Projekte$


Mhh, ich habe meinen Code schon kontrolliert,
und auch die Variable $data hat den richtigen
Inhalt nämlich: /home/apensiv/Desktop/wichtige_dokument.txt

Hoffe ihr könnt mir helfen.

mfg

zero77

Moderator & Wiki-Admin

Beiträge: 4 364

Wohnort: Sachsen Anhalt

Distribution: Kubuntu

Version: 9.10

Desktop: KDE4

Architektur: 64-Bit PC

22

Donnerstag, 8. November 2007, 12:49

Moin,
so nach einem Tag offline - Dank an Arcor, gehts wieder weiter ;-)

@maettu:
Ich lasse mittlerweile mit dem Script so ziemlich alle wichtigen Verzeichnisse sichern. Mein Gedanke war, dass ich z.B. mein mp3-Verzeichniss sichere und irgendwann mal einige mp3´s lösche. Nun sind die gelöschten ja noch im Sicherungsverzeichnis vorhanden.
Durch das Kopieren werden ja nur neue und aktualisierte files angesprochenen. Nun wollte ich etwas haben, was quasi sämtliche Ordner rekursiv durchsucht und feststellt, welche Files im Sicherungsverzeichnis vorhanden sind und im Quellverzeichnis nicht. Die Files, die im Quellverzeichnis nicht mehr vorhanden sind, sollen dann auch im Sicherungsverzeichnis gelöscht werden.

@Apensiv
Die UUID in dem Script ist natürlich an meine Situation angepasst. Entweder muss man sich dann das Script für seine Verhältnisse anpassen, also die UUID der Backup-Mediums eintragen oder, - wenn du schon an der Integration einer conf bastelst - dann kann man die ja auch damit aufnehmen lassen.
Ich lasse meine externe USB-Platte schon in der fstab per UUID mounten, bin mir nicht sicher, inwieweit das notwendig ist. Aber wie gesagt, meine Überlegung war, dass sich externe Medien in ihrer /dev/sdxx-Bezeichnung ändern (können). Btw. UUID kann man sich per:

Quellcode

1
ls -l /dev/disk/by-uuid


anzeigen lassen.

Zu deiner Fehlermeldung, ich bin mir nicht sicher, aber versuch doch mal ein chomp in deine Schleife einzubauen - ich glaube, ich hätte das mal irgendwo gelesen:

PHP-Quelltext

1
2
3
4
while(<CONFIG>){
              chomp ($_);
              push(@Dateien,$_); 
}



Gruß
~ Two hours of trial and error can save ten minutes of RTFM ~

Apensiv

Profi

Beiträge: 917

Distribution: Andere

Andere Distribution: Debian

Version: 5.0

Desktop: GNOME

Architektur: 32-Bit PC

23

Freitag, 9. November 2007, 22:16

So habe es nun hinbekommen, nun kann man eigene Dateien in der Konsole
über:

Quellcode

1
./backup.pl -add /home/Desktop/user/dokument.odt

hinzufügen.

Code:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/perlbackup.pl -- by Apensiv and zero77

use POSIX qw/strftime/;
use File::Copy;
$command_one $ARGV['0'];
$command_two $ARGV['1'];
if ($command_one eq "-add")
{
    open(CONF,">>backup.conf");
    print CONF "$command_two\n";
    close(DATEI);
    print "$command_two wurde der backup.conf hinzugefuegt, bitte machen sie ein Backup\n";
}
else{
my @log;
$home $ENV{'HOME'} . "/.mozilla/firefox/7x14efmv.default/bookmarks.html";
$backup_medium '/home/apensiv/Desktop';
$date strftime "%d.%m.%Y"localtime;

if (-"$backup_medium")
{

mkdir ("$backup_medium/backup");
system("dpkg --get-selections | grep -v deinstall > $backup_medium/backup/ubuntu-files");
copy('/etc/apt/sources.list'"$backup_medium/backup/");
copy('/etc/X11/xorg.conf'"$backup_medium/backup/");
copy('/etc/fstab'"$backup_medium/backup/");
copy('/etc/samba/smb.conf'"$backup_medium/backup/");
copy($home"$backup_medium/backup/");

if (-"backup.conf"){
    my @Dateien;
    open(CONFIG"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
    while(<CONFIG>){
              chomp($_);
              push(@Dateien,$_);}
    close(CONFIG);
    $var $Dateien[0];
    copy ("$var""$backup_medium/backup/");
    }
    
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");

if (-"$backup_medium/backup_$date.tar"){
    print "Backup erfolgreich erstellt\n";}
else{
    print "ERROR: Es konnte kein Backup erstellt werden\n";}}
else{
    print "Backupmedium konnte nicht gefunden werden\n";}}


@zero77: Bitte füge deine Sachen auch noch hinzu achte aber bitte darauf,
das das Programm portabel bleibt, also keine UUIDs die man anpassen muss. ;)

BTW:

Quellcode

1
ls -l /dev/disk/by-uuid

Wieder mal etwas gelernt. Vielen Dank! :)

Als nächste Aufgabe, werde ich einen Befehl einbauen, mit dem man das Backup-Verzeichnis
ändern kann.


mfg

zero77

Moderator & Wiki-Admin

Beiträge: 4 364

Wohnort: Sachsen Anhalt

Distribution: Kubuntu

Version: 9.10

Desktop: KDE4

Architektur: 64-Bit PC

24

Freitag, 9. November 2007, 22:24

Zitat

Als nächste Aufgabe, werde ich einen Befehl einbauen, mit dem man das Backup-Verzeichnis ändern kann.


hab ich schon, bzw. die Möglichkeit, die Partition zu ändern - werd es demnächst online stellen.

Siehst du eine Möglichkeit über die Perl copy-Funktion Verzeichnisse rekursiv und mit versteckten Verzeichnissen zu kopieren und zwar so, dass sie nach dem tar noch ihre ursprünglichen Dateieigenschaften besitzen?

Das war nämlich mein Problem und der Grund, warum ich über

Quellcode

1
system("cp -aru ...");
gegangen bin.

Ich wollte z.B. mein home-Verzeichnis und noch andere direkt auf die Backup-Platte bringen, so dass ich das Ganze im Falle eines Falles nur zurückkopieren muss. So habe ich auch meine mp3s, bilder etc gesichert. Alles in allem sind das knappe 50gb. Wenn ich das Script, so wie ich es habe mit

Quellcode

1
cp -aru
starte, sichert er einmal den ganzen Kram rüber und später checkt er nur noch, was sich geändert hat bzw. dazugekommen ist. Dauert einmal lange und dann hab ich aber auch wirklich alle Daten redundant und folgende Backups sind relativ fix.

Gruß zero

Nachtrag:

so sieht es zur Zeit bei mir aus:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#!/usr/bin/perl -w
# backup.pl -- inspired by Apensiv
#           -- by zero77

use strict;

# eingebundene module
use POSIX qw/strftime/; # uhrzeit

#use File::Copy; # betriebssystemunabhaengige file-copy-funktion

my $home $ENV{'HOME'};
my $backup_medium='/files/backup'my $verzeichnis="/dev/disk/by-uuid";
my $target;
my $date=strftime "%d_%m_%Y"localtime;
my $progress=0;
my @laufwerke;
my $z_laufwerke;
my $i;
my $auswahl;
my $method;
my $eingabe;
my $update;


# auslesen der vorhandenen laufwerke
opendir(DIR$verzeichnis) || die "$verzeichnis: $!";
@laufwerke=readdir(DIR);
$z_laufwerke=@laufwerke-2;
closedir(DIR);
chdir $verzeichnis;

# ausgabe der uuids mit passenden /dev/xxx
$i=1;
foreach (@laufwerke) {
    if (-l $_) {
        my $link=readlink($_);
        $link=~s/../..//g;
        print "\n" $i ") " $link " (UUID " $_ ") ";
        $i++;
    }
}
print "\n";

print "Medium auswählen: (1-" $z_laufwerke "): ";
$auswahl=<STDIN>;
chomp $auswahl;

if ($auswahl eq "") {
    $target="41f9f791-bae0-4ae9-9531-922714a9ec8e";
}
else {
    $target=$laufwerke[$auswahl+1];
}

# ziellaufwerk ueberpruefungen
if (-"/dev/disk/by-uuid/$target") { # platte angeschlossen?
    
    if (!-"$backup_medium") { # platte gemountet?
        my $mount=system("mount /files");
    
        if ($mount==0) { # wenn nicht, mounten
            print "Externe USB - Platte gemountet\n";
        }    
    }
    
    #backup-art festlegen
    $target=readlink($target);
    $target=~s/../../ /g;
    
    print "Ziellaufwerk:" $target "\n";
    print "\n";
    print "1) Update des Backup - erstellt komplettes Backup oder bringt Backup up2date\n";
    print "2) Tagesstand sichern - erstellt komplettes Backup mit Zeitstempel\n";
    print "Bitte wählen: ";
    
    $method=<STDIN>;
    chomp $method;
    
    while ($method ne "1" and $method ne "2") {
        print "Bitte wählen (1 oder 2): ";
        $method=<STDIN>;
        chomp $method;
    }
    
    if ($method eq "1") {
        $progress=1;
    }
    else {
        
        $backup_medium=$backup_medium "/" $date;
        print "ttt: $backup_medium\n";
        if (!-"$backup_medium") { # existiert aktuelles verzeichnis
            system("mkdir $backup_medium");
            $progress=1;
        }
        else {
            print ("\nVerzeichnis mit aktuellem Datum $date vorhanden\n");
            print ("Backup fortsetzen? (ja/nein): ");
            $eingabe=<STDIN>;
            chomp $eingabe;
            
            while ($eingabe ne "ja" and $eingabe ne "nein") {
                print "ja oder nein: ";
                $eingabe=<STDIN>;
                chomp $eingabe;
            }
            
            if ($eingabe eq "ja") { # update oder ueberschreiben
                print ("Update des Backups oder Verzeichnis neu? (upd/neu): ");
                $update=<STDIN>;
                chomp $update;
                    
                while ($update ne "upd" and $update ne "neu") {
                    print "upd oder neu: ";
                    $update=<STDIN>;
                    chomp $update;
                }
                
                if ($update eq "neu") { 
                    print "Entferne altes Backup...\n";
                    system ("rm -rfv $backup_medium");    
                    system("mkdir $backup_medium");
                }
                $progress=1;    
            }
        }
    }
    
    backup
    if ($progress==1) {
        if (!-"$backup_medium/configfiles") {
            system("mkdir $backup_medium/configfiles");
        }
        print "Sichere Daten:\n";
        print "sichere Liste der installierten Programme... \n";
            system("dpkg --get-selections | grep -v deinstall > $backup_medium/configfiles/ubuntu_files");
        print "sichere /etc/apt/sources.list... \n";
            system("cp -aru /etc/apt/sources.list  $backup_medium/configfiles/");
        print "sichere /etc/fstab... \n";
            system("cp -aru /etc/fstab $backup_medium/configfiles/");
        print "sichere /etc/X11/xorg.conf... \n";
            system("cp -aru /etc/X11/xorg.conf $backup_medium/configfiles/");
        print "sichere /etc/samba/smb.conf... \n";
            system("cp -aru /etc/samba/smb.conf $backup_medium/configfiles/");
        print "sichere /home...";
            system("cp -aru $home $backup_medium/");
        print "sichere projekte... \n";
            system("cp -aru /storage/projekte $backup_medium/");
        print "sichere bilder... \n";
            system("cp -aru /storage/bilder $backup_medium/");
        print " sichere mp3... \n";
            system("cp -aru /storage/mp3 $backup_medium/");
        print " sichere pimp... \n";
            system("cp -aru /storage/pimp $backup_medium/");
        print " sichere tellico... \n";
            system("cp -aru /storage/tellico $backup_medium/");
        print " sichere scripts... \n";
            system("cp -aru /storage/scripts $backup_medium/");
        print " sichere win_xp... \n";
            system("cp -aru /storage/win_xp $backup_medium/");
        print " sichere lampp-Dateien... \n";
            system("cp -aru /opt/lampp/htdocs $backup_medium/");
            
        print "\n Backup beendet\n"
    }
    else {
        print "Beende Backup-Vorgang\n";
    }
}
else { # platte nicht angeschlossen
    print "Backup-Medium nicht angeschlossen\n";
    print "Beende Backup-Vorgang, bitte externe USB-Platte anschließen\n";
}

#dpkg --set-selections < ubuntu-files
#sudo dselect

#Nach Start von dselect  "I" druecken, nach Installation aller Pakete mit "Q" oder "B" (je nach Sprachversion) beenden.


= snapshot 8)
~ Two hours of trial and error can save ten minutes of RTFM ~

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »zero77« (9. November 2007, 22:45)


Apensiv

Profi

Beiträge: 917

Distribution: Andere

Andere Distribution: Debian

Version: 5.0

Desktop: GNOME

Architektur: 32-Bit PC

25

Samstag, 10. November 2007, 16:04

So habe gemerkt, dass ich gestern noch einen
Fehler eingebaut habe und zwar sicherte er
nur die erste Datei die in der backup.conf
gespeichert war.
Hiermit funktioniert es richtig:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/perlbackup.pl -- by Apensiv and zero77

use POSIX qw/strftime/;
use File::Copy;
$command_one $ARGV['0'];
$command_two $ARGV['1'];
if ($command_one eq "-add")
{
    open(CONF,">>backup.conf");
    print CONF "$command_two\n";
    close(DATEI);
    print "$command_two wurde der backup.conf hinzugefuegt, bitte machen sie ein Backup\n";
}
else{
my @log;
$home $ENV{'HOME'} . "/.mozilla/firefox/7x14efmv.default/bookmarks.html";
my @config;
open(CONFIGFILE"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
while(<CONFIGFILE>){
    chomp($_);
    push(@config,$_);}
close(CONFIGFILE);
$backup_medium $config["0"];
$date strftime "%d.%m.%Y"localtime;

if (-"$backup_medium")
{

mkdir ("$backup_medium/backup");
system("dpkg --get-selections | grep -v deinstall > $backup_medium/backup/ubuntu-files");
copy('/etc/apt/sources.list'"$backup_medium/backup/");
copy('/etc/X11/xorg.conf'"$backup_medium/backup/");
copy('/etc/fstab'"$backup_medium/backup/");
copy('/etc/samba/smb.conf'"$backup_medium/backup/");
copy($home"$backup_medium/backup/");

if (-"backup.conf"){
    my @Dateien;
    open(CONFIG"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
    while(<CONFIG>){
              chomp($_);
              push(@Dateien,$_);}
    close(CONFIG);
    $anzahl = @Dateien;
    my $count "2";
    while ($count <= $anzahl)
    {
        $var $Dateien[$count];
        copy ("$var""$backup_medium/backup/");
        $count++;
    }
    
    
    }
    
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");

if (-"$backup_medium/backup_$date.tar"){
    print "Backup erfolgreich erstellt\n";}
else{
    print "ERROR: Es konnte kein Backup erstellt werden\n";}}
else{
    print "Backupmedium konnte nicht gefunden werden\n";}}


mfg

EDIT:
Noch ein Update, das Backupverzeichnis muss nun in der backup.conf
festgelegt werden und alle Dateien ausser die "ubuntu-files" mit den
Installierten Anwendungen müssen auch in der backup.conf eingefügt werden.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perlbackup.pl -- by Apensiv and zero77

use POSIX qw/strftime/;
use File::Copy;
$command_one $ARGV['0'];
$command_two $ARGV['1'];
if ($command_one eq "-add")
{
    open(CONF,">>backup.conf");
    print CONF "$command_two\n";
    close(DATEI);
    print "$command_two wurde der backup.conf hinzugefuegt, bitte machen sie ein Backup\n";
}
else{
my @log;
$home $ENV{'HOME'};
my @config;
open(CONFIGFILE"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
while(<CONFIGFILE>){
    chomp($_);
    push(@config,$_);}
close(CONFIGFILE);
$backup_medium $config["0"];
$date strftime "%d.%m.%Y"localtime;

if (-"$backup_medium"){

mkdir ("$backup_medium/backup");
system("dpkg --get-selections | grep -v deinstall > $backup_medium/backup/ubuntu-files");

if (-"backup.conf"){
    my @Dateien;
    open(CONFIG"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
    while(<CONFIG>){
              chomp($_);
              push(@Dateien,$_);}
    close(CONFIG);
    $anzahl = @Dateien;
    my $count "2";
    while ($count <= $anzahl){
        $var $Dateien[$count];
        copy ("$var""$backup_medium/backup/");
        $count++;}}
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");

if (-"$backup_medium/backup_$date.tar"){
    print "Backup erfolgreich erstellt\n";}
else{
    print "ERROR: Es konnte kein Backup erstellt werden\n";}}
else{
    print "Backupmedium konnte nicht gefunden werden\n";}}


Hier mal ein Blick in die Backup.conf:

Zitat

/media/disk

/etc/apt/sources.list
/etc/X11/xorg.conf
/etc/fstab
/etc/samba/smb.conf


Edit2: Und noch ein Update:

Nun kann man mit

Quellcode

1
./backup.pl -medium /media/usb-stick

das Backupverzeichnis verändern.

Code:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perlbackup.pl -- by Apensiv and zero77

use POSIX qw/strftime/;
use File::Copy;
$command_one $ARGV['0'];
$command_two $ARGV['1'];
if ($command_one eq "-add"){
    open(CONF,">>backup.conf");
    print CONF "$command_two\n";
    close(CONF);
    print "$command_two wurde der backup.conf hinzugefuegt, bitte machen sie ein Backup\n";}
elsif ($command_one eq "-medium"){
    my @Dateien;
    open(MED_CONFIG_R"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
    while(<MED_CONFIG_R>){
              chomp($_);
              push(@Dateien,$_);}
    close(MED_CONFIG_R);
    @Dateien["0"] = $command_two;
    open(MED_CONF_W,">backup.conf");
    foreach $name (@Dateien) {
          print MED_CONF_W "$name\n";}
    close(MED_CONF_W);
    print "Das neue Backupverzeichnis lautet: " . @Dateien["0"] . "\n";    }
else{
my @log;
$home $ENV{'HOME'};
my @config;
open(CONFIGFILE"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
while(<CONFIGFILE>){
    chomp($_);
    push(@config,$_);}
close(CONFIGFILE);
$backup_medium $config["0"];
$date strftime "%d.%m.%Y"localtime;

if (-"$backup_medium"){
mkdir ("$backup_medium/backup");
system("dpkg --get-selections | grep -v deinstall > $backup_medium/backup/ubuntu-files");

if (-"backup.conf"){
    my @Dateien;
    open(CONFIG"<backup.conf") || die "backup.conf: Oeffnen fehlgeschlagen\n";
    while(<CONFIG>){
              chomp($_);
              push(@Dateien,$_);}
    close(CONFIG);
    $anzahl = @Dateien;
    my $count "2";
    while ($count <= $anzahl){
        $var $Dateien[$count];
        copy ("$var""$backup_medium/backup/");
        $count++;}}
system("tar --remove-files -C $backup_medium -cvf $backup_medium/backup_$date.tar backup");

if (-"$backup_medium/backup_$date.tar"){
    print "Backup erfolgreich erstellt\n";}
else{
    print "ERROR: Es konnte kein Backup erstellt werden\n";}}
else{
    print "Backupmedium konnte nicht gefunden werden\n";}}

zero77

Moderator & Wiki-Admin

Beiträge: 4 364

Wohnort: Sachsen Anhalt

Distribution: Kubuntu

Version: 9.10

Desktop: KDE4

Architektur: 64-Bit PC

26

Montag, 12. November 2007, 17:10

Nach dem ich beim näheren Betrachten, mein Script doch etwas grottig fand, habe ich den Code nochmal generalüberholt:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#!/usr/bin/perl -w
# by zero77 & apensiv

# script zum einfachen sichern von dateien und verzeichnissen
# auf ein beliebiges laufwerk, in ein beliebiges verzeichnis
#
# zu sichernde files werden in der subroutine Kopiere_dateien
# festgelegt und können dort geändert werden:
#    @config_files >> konfigurationsdateien
#    @backup_files >> beliebige dateien und verzeichnisse

# module
use strict;
use Getopt::Std;
use POSIX qw/strftime/;
use File::Find;
use File::Copy;
use File::Path;

# variablen
our $opt_h;
our $opt_t;
our $opt_f;

my $date=strftime "%d_%m_%Y"localtime;
my $home $ENV{'HOME'};
my $input;
my $select;
my $path;

# check der parameter
getopts("t:h,f");

if ($opt_h) {
    Hilfe();
}
else {
    if ($opt_t){
        my $test=$opt_t;

        if (chop ($testne "/") {
            $opt_t=$opt_t."/";
        }
        Pruefe_ziel();

        if ($opt_f) {
            print "Komplettes Backup\n";
        }
        else {
            print "Erstellen oder Aktualisieren des Backups\n";
        }

        Waehle_ordner();

        print "\n Backup-Ordner nach Sichern packen (ja/nein; default=\'nein\'): ";
        my $tar=<STDIN>;
        chomp $tar;

        if ($tar eq "") {
            $tar="nein";
        }

        while ($tar ne "ja" and $tar ne "nein") {
            print " ja oder nein: ";
            $tar=<STDIN>;
            chomp $tar;
        }
        my $time_start=time();

        Kopiere_dateien();

        if ($tar eq "ja") {
            Packe_ordner();
        }
        print " Sicherung erstellt\n";
        my $time_end=time();
        my $time=$time_end-$time_start;
        my $minutes=int($time/60);
        my $seconds=$time%60;

        if ($minutes <= "0") {
            print " Dauer des Sicherungsvorgangs: $seconds s\n";
        }
        else {
            $minutes=int ($time/60);
            print " Dauer des Sicherungsvorgangs: $minutes min, $seconds s\n";
        }
    }
    else {
        print " Bitte Zielverzeichnis angeben!\n";
        Hilfe();
    }
}

# subroutinen
sub Hilfe {
    print " USAGE: backup.pl -t [/pfad/zum/ziel] [OPTION]\n";
    print " -t [/pfad/zum/ziel]    Zielverzeichnis angeben\n";
    print "             ...dort wird der das Sicherungsverzeichnis erstellt bzw. genutzt\n";
    print " -f             komplettes Backup, eventuell vorhandenes Backup wird überschrieben\n";
    print " -h            gibt diese Hilfe aus\n";
}

sub Pruefe_ziel {

    if (!-e $opt_t) {
        die " Option \'-t $opt_t\' überprüfen >> $opt_t existiert nicht\n";
    }
}

sub Waehle_ordner {
    print " 1) Backupnamen wählen\n";
    print " 2) Datum \'$date\' setzen\n";
    print " Bitte wählen (default=\'1\'): ";
    $select=<STDIN>;
    chomp $select;

    if ($select eq "") {
        $select="1";
    }

    while ($select ne "1" and $select ne "2") {
        print " Bitte wählen (1 oder 2): ";
        $select=<STDIN>;
        chomp $select;
    }

    if ($select eq "1") {
        print "\n Vorhandene Dateien: ";
        my $dir=$opt_t;

        Lese_verzeichnis($dir);

        print Backupnamen eingeben (default=\'backup\'): ";
        $input=<STDIN>;
        chomp $input;

        if ($input eq "") {
            $input="backup";
        }
    }
    else {
        $input=$date;
    }
    $path=$opt_t.$input;

    if (-e $path) {
        print " * Verzeichnis $path existiert\n";

        if ($opt_f) {
            print " * erstelle \'$input\' neu\n";
        }
        else {
            print " * aktualisiere \'$input\'\n";
        }
    }
    else {
        print " * \'$input\' existiert nicht in $opt_t\n";
        print " * lege \'$input\' an\n";
        mkpath ($path);
    }
}

sub Lese_verzeichnis  {
    my $dir=$_[0];
    my @subdir;
    my $count_subs;

    opendir(DIR$dir) || die "$dir: $!";
    @subdir=readdir(DIR);
    $count_subs=@subdir;

    if ($count_subs == 2) {
        print $count_subs-"! ";
        print " Da keine Unterverzeichnisse existieren, kann es sein, dass das gewünschte Laufwerk nicht gemountet ist. \n";
        print " Mounten versuchen (ja/nein)? ";
        my $mount=<STDIN>;
        chomp $mount;

        while ($mount ne "ja" and $mount ne "nein") {
            print " ja oder nein: ";
            $mount=<STDIN>;
            chomp $mount;
        }

        if ($mount eq "ja") {
            Mounte_verzeichnis();
        }
    }
    foreach (@subdir) {
        my $test=index($_,".");

        if ($test != and $_ ne "lost+found") {
            print "$_ ";
        }
    }
    print "\n";
    closedir(DIR);
    chdir $opt_t;
}

sub Mounte_verzeichnis {
    my $mount=system("mount $opt_t");
    print " * mounte $opt_t ";

    if ($mount==0) { # wenn nicht, mounten
        print " ok\n";
    }
    else {
        die " mounten fehlgeschlagen";
    }
}

sub Kopiere_dateien {

    if ($opt_f) {
        rmtree ("$path/*") || die " Problem beim Löschen";
        print " * erstelle vorhandenes Backup neu\n";
    }

    if (!-"$path/configfiles") {
        mkdir ("$path/configfiles");
    }
    my @config_files=("/etc/apt/sources.list",
              "/etc/fstab",
              "/etc/X11/xorg.conf",
              "/etc/samba/smb.conf");
    my @backup_files=("$home",
              "/opt/lampp/htdocs/",
              "/storage/projekte/",
              "/storage/pimp/",
              "/storage/win_xp",
              "/storage/bilder/",
              "/storage/mp3/");

    print " Sichere Daten:\n";
    print " * sichere Liste der installierten Programme... ";
        system("dpkg --get-selections | grep -v deinstall > $path/configfiles/ubuntu_files");
        print ("ok\n");
    print " * sichere Config-Files:\n";

    foreach (@config_files) {
        print "    $_... ";
        copy ($_,"$path/configfiles");
        print "ok\n";
    }

    foreach (@backup_files) {
        print " * sichere $_... ";
        system("cp -aruf $_ $path/");
        print "ok\n";
    }
    print "\n Kopiervorgang beendet\n";
}

sub Packe_ordner {
    print "Packe $path\n";
    system("tar --remove-files -C $path -cvf $path"."_"."$date.tar $path");
    print " * $path gepackt\n";

    if (-"$path" "_" "$date.tar"){
        print Backup erfolgreich erstellt\n";}
    else{
        print " Fehler beim Packen\n";
    }
}

#installieren der ubuntu_files
#
# * dpkg --set-selections < ubuntu-files
# * sudo dselect
# Nach Start von dselect  "I" druecken, nach Installation aller Pakete mit "Q" oder "B" (je nach Sprachversion) beenden.


Das Array, dass die zu sichernden Datei beinhaltet, kann natürlich leicht aus einer conf-Datei gespeist werden.

@ Apensiv

Zitat

Quellcode

1
./backup.pl -medium /media/usb-stick

bekommst du da keinen Ärger, wenn der Stick mal nicht gemountet ist bzw. zwei USB-Medien angeschlossen sind?

Gruß Sven


P.S.:
Wo kommt dieser riesige Freiraum nach dem Code her?

EDIT: Leichte Änderungen im Quellcode
~ Two hours of trial and error can save ten minutes of RTFM ~

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »zero77« (12. November 2007, 22:54)


Apensiv

Profi

Beiträge: 917

Distribution: Andere

Andere Distribution: Debian

Version: 5.0

Desktop: GNOME

Architektur: 32-Bit PC

27

Montag, 12. November 2007, 17:25

Hoi so lob ich mir das ;)

Zitat

bekommst du da keinen Ärger, wenn der Stick mal nicht gemountet ist bzw. zwei USB-Medien angeschlossen sind?...


Nein noch nicht, ich muss noch eine Mecker-Funktion einbauen, die
auftritt wenn es das Verzeichnis nicht gibt.
Zur Zeit übernimmt er den Pfad einfach nicht,
wenn es ihn nicht gibt.

Wo tritt bei dir dieser riesige Freiraum auf?

Ach, dass mit der Angabe wielange der Backup-Vorgang gedauert hat
werde ich auch noch in meinem Code-Teil einbauen.
Zusätzlich noch einige Überprüngen und dem Arbeiten mit Parametern
und nicht nur mit einzelnen Kristalloperatoren.

Finde unsere Skripte, die sich ausseinander entwickelt haben,
aber schon recht gut gelungen.

mfg

BTW:

Zitat

Nach dem ich beim näheren Betrachten, mein Script doch etwas grottig fand...


Passiert mir auch ständig :(

zero77

Moderator & Wiki-Admin

Beiträge: 4 364

Wohnort: Sachsen Anhalt

Distribution: Kubuntu

Version: 9.10

Desktop: KDE4

Architektur: 64-Bit PC

28

Montag, 12. November 2007, 19:54

Zitat

Zur Zeit übernimmt er den Pfad einfach nicht,wenn es ihn nicht gibt.


Das meinte ich. Wenn du z.B; den Pfad mit angibst, auch wenn das Medium nicht gemountet ist. Bzw. versuch mal bei zwei eingesteckten Sticks, genau den richtigen anzusprechen, wenn hal die Querbeet mountet (nach ab- und anstöpseln z.B.) 8)

Zitat

Wo tritt bei dir dieser riesige Freiraum auf?


Wenn ich hier Code reinposte, sind manchmal ca. 10-15 Leerzeilen darunter, bis der nächste Text erscheint - ah sehe gerade, das ist nur beim Opera so, Firefox zeigt´s richtig an.

Zitat

Zitat


Nach dem ich beim näheren Betrachten, mein Script doch etwas grottig fand...



Passiert mir auch ständig

... wenns doch nur immer die Scripte wären :P

Gruß Sven
~ Two hours of trial and error can save ten minutes of RTFM ~

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »zero77« (12. November 2007, 19:57)


zero77

Moderator & Wiki-Admin

Beiträge: 4 364

Wohnort: Sachsen Anhalt

Distribution: Kubuntu

Version: 9.10

Desktop: KDE4

Architektur: 64-Bit PC

29

Montag, 24. Dezember 2007, 11:50

So nach langer Zeit ein Update und Doppelpost :D

Ich habe noch einiges geändert. Vor allem der Einsatz von rsync sollte das Ganze ein wenig komfortabler gestalten:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#!/usr/bin/perl -w
# by zero77 & apensiv

# script zum einfachen sichern von dateien und verzeichnissen
# auf ein beliebiges laufwerk, in ein beliebiges verzeichnis
#
# zu sichernde files werden in der subroutine Kopiere_dateien
# festgelegt und können dort geändert werden:
#    @config_files >> konfigurationsdateien
#    @backup_files >> beliebige dateien und verzeichnisse

# module
use strict;
use Getopt::Std;
use POSIX qw/strftime/;
use File::Find;
use File::Copy;
use File::Path;

# variablen
our $opt_h;
our $opt_t;
our $opt_f;

my $date=strftime "%d_%m_%Y"localtime;
my $home $ENV{'HOME'};
my $input;
my $select;
my $path;

# check ob root
if ($<!=0) {
        print "need to be root\n";
    exit;
}
# check der parameter
getopts("t:h,f");

if ($opt_h) {
    Hilfe();
}
else {
    if ($opt_t){
        my $test=$opt_t;

        if (chop ($testne "/") {
            $opt_t=$opt_t."/";
        }
        Pruefe_ziel();

        if ($opt_f) {
            print "Komplettes Backup\n";
        }
        else {
            print "Erstellen oder Aktualisieren des Backups\n";
        }

        Waehle_ordner();

        print "\n Backup-Ordner nach Sichern packen (ja/nein; default=\'nein\'): ";
        my $tar=<STDIN>;
        chomp $tar;

        if ($tar eq "") {
            $tar="nein";
        }

        while ($tar ne "ja" and $tar ne "nein") {
            print " ja oder nein: ";
            $tar=<STDIN>;
            chomp $tar;
        }
        my $time_start=time();

        Kopiere_dateien();

        if ($tar eq "ja") {
            Packe_ordner();
        }
        print " Sicherung erstellt\n";
        my $time_end=time();
        my $time=$time_end-$time_start;
        my $minutes=int($time/60);
        my $seconds=$time%60;

        if ($minutes <= "0") {
            print " Dauer des Sicherungsvorgangs: $seconds s\n";
        }
        else {
            $minutes=int ($time/60);
            print " Dauer des Sicherungsvorgangs: $minutes min, $seconds s\n";
        }
    }
    else {
        print " Bitte Zielverzeichnis angeben!\n";
        Hilfe();
    }
}

# subroutinen
sub Hilfe {
    print " USAGE: backup.pl -t [/pfad/zum/ziel] [OPTION]\n";
    print " -t [/pfad/zum/ziel]    Zielverzeichnis angeben\n";
    print "             ...dort wird der das Sicherungsverzeichnis erstellt bzw. genutzt\n";
    print " -f             komplettes Backup, eventuell vorhandenes Backup wird überschrieben\n";
    print " -h            gibt diese Hilfe aus\n";
}

sub Pruefe_ziel {

    if (!-e $opt_t) {
        die " Option \'-t $opt_t\' überprüfen >> $opt_t existiert nicht\n";
    }
}

sub Waehle_ordner {
    print " 1) Backupnamen wählen\n";
    print " 2) Datum \'$date\' setzen\n";
    print " Bitte wählen (default=\'1\'): ";
    $select=<STDIN>;
    chomp $select;

    if ($select eq "") {
        $select="1";
    }

    while ($select ne "1" and $select ne "2") {
        print " Bitte wählen (1 oder 2): ";
        $select=<STDIN>;
        chomp $select;
    }

    if ($select eq "1") {
        print "\n Vorhandene Dateien: ";
        my $dir=$opt_t;

        Lese_verzeichnis($dir);

        print Backupnamen eingeben (default=\'backup\'): ";
        $input=<STDIN>;
        chomp $input;

        if ($input eq "") {
            $input="backup";
        }
    }
    else {
        $input=$date;
    }
    $path=$opt_t.$input;
    
    if (-e $path) {
        print " * Verzeichnis $path existiert\n";

        if ($opt_f) {
            print " * erstelle \'$input\' neu\n";
            rmtree ("$path") || die " Problem beim Löschen";
        }
        else {
            print " * aktualisiere \'$input\'\n";
        }
    }
    else {
        print " * \'$input\' existiert nicht in $opt_t\n";
        print " * lege \'$input\' an\n";
        mkpath ($path);
    }
}

sub Lese_verzeichnis  {
    my $dir=$_[0];
    my @subdir;
    my $count_subs;

    opendir(DIR$dir) || die "$dir: $!";
    @subdir=readdir(DIR);
    $count_subs=@subdir;

    if ($count_subs == 2) {
        print $count_subs-"! ";
        print " Da keine Unterverzeichnisse existieren, kann es sein, dass das gewünschte Laufwerk nicht gemountet ist. \n";
        print " Mounten versuchen (ja/nein)? ";
        my $mount=<STDIN>;
        chomp $mount;

        while ($mount ne "ja" and $mount ne "nein") {
            print " ja oder nein: ";
            $mount=<STDIN>;
            chomp $mount;
        }

        if ($mount eq "ja") {
            Mounte_verzeichnis();
        }
    }
    foreach (@subdir) {
        my $test=index($_,".");

        if ($test != and $_ ne "lost+found") {
            print "$_ ";
        }
    }
    print "\n";
    closedir(DIR);
    chdir $opt_t;
}

sub Mounte_verzeichnis {
    my $mount=system("mount $opt_t");
    print " * mounte $opt_t ";

    if ($mount==0) { # wenn nicht, mounten
        print " ok\n";
    }
    else {
        die " mounten fehlgeschlagen";
    }
}

sub Kopiere_dateien {
    if (!-"$path/configfiles") {
        mkdir ("$path/configfiles");
    }
    my @config_files=(
              "/etc/apt/sources.list",
              "/etc/fstab",
              "/etc/X11/xorg.conf",
              "/etc/samba/smb.conf",
              "/etc/apache2/apache2.conf",
              "/etc/apache2/sites-available/default"
    );
    my @backup_files=(
              #"$home",
              "/opt/firefox",
              "/opt/eclipse"
    );
    
    print " Sichere Daten:\n";
    print " * sichere Liste der installierten Programme... ";
        system("dpkg --get-selections | grep -v deinstall > $path/configfiles/ubuntu_files");
        print ("ok\n");
    print " * sichere Config-Files:\n";

    foreach (@config_files) {
        print "    $_... ";
        system("rsync -av $_ $path/configfiles");
        print "ok\n";
    }
    
    foreach (@backup_files) {
        print " * sichere $_... ";
        system("rsync -av --delete $_ $path");
        print "ok\n";
    }
    print "\n Kopiervorgang beendet\n";
}

sub Packe_ordner {
    print "Packe $path\n";
    system("tar --remove-files -C $path -cvf $path"."_"."$date.tar $path");
    print " * $path gepackt\n";

    if (-"$path" "_" "$date.tar"){
        print Backup erfolgreich erstellt\n";}
    else{
        print " Fehler beim Packen\n";
    }
}

#installieren der ubuntu_files
#
# * dpkg --set-selections < ubuntu-files
# * sudo dselect
# Nach Start von dselect  "I" druecken, nach Installation aller Pakete mit "Q" oder "B" (je nach Sprachversion) beenden.
~ Two hours of trial and error can save ten minutes of RTFM ~

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »zero77« (24. Dezember 2007, 11:52)


Apensiv

Profi

Beiträge: 917

Distribution: Andere

Andere Distribution: Debian

Version: 5.0

Desktop: GNOME

Architektur: 32-Bit PC

30

Dienstag, 25. Dezember 2007, 02:21

Guten Abend,

und das Projekt läuft wieder!
Ich habe schon überlegt welche Erweiterungen ich noch für meine
Anforderungen brauche, mir ist leider nichts mehr eingefallen.
(Ausser die gebrauchte Zeit zum Backupen ;) )


Ich hätte Lust auf ein neues Programm welches man hier verbessert und
bespricht ;)

mfg

zero77

Moderator & Wiki-Admin

Beiträge: 4 364

Wohnort: Sachsen Anhalt

Distribution: Kubuntu

Version: 9.10

Desktop: KDE4

Architektur: 64-Bit PC

31

Dienstag, 25. Dezember 2007, 10:18

Hallo,

Zitat

Ausser die gebrauchte Zeit zum Backupen


Das sind minimal drei Zeilen-Code, geht ja ganz easy mit

PHP-Quelltext

1
time()


Zitat

Lust auf ein neues Programm


lass dir halt was einfallen... :D
~ Two hours of trial and error can save ten minutes of RTFM ~