source: trunk/admin/chkconfcvs.pl@ 155

Last change on this file since 155 was 3, checked in by stephand, on Apr 11, 2001 at 12:42:44 PM

Funktion dieses Scripts:
Es sollen Konfigurationsdatei (z.B. in /etc und /var) im CVS gepflegt werden.
Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben
und kopiert diese auf Wunsch in das CVS-Arbeitsverzeichnis

File size: 3.4 KB
Line 
1#!/usr/bin/perl -w
2
3# $Id: chkconfcvs.pl,v 1.1 2001/04/11 10:42:44 stephand Exp $
4
5# 20040410 stephan.duehr@suse.de
6# Funktion dieses Scripts:
7# Es sollen Konfigurationsdatei (z.B. in /etc und /var) im CVS gepflegt werden.
8# Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben
9# und kopiert diese auf Wunsch in das CVS-Arbeitsverzeichnis
10
11# Parameter: CVS-Arbeitsverzeichnis
12# (dort muß die Verzeichnisstruktur bezogen auf / abgebildet sein,
13# z.B. etc, var usw.
14
15use POSIX qw/getpgrp tcgetpgrp/;
16
17use File::Find;
18use File::Compare;
19use File::Copy;
20use strict;
21
22my $cvsworkdir = $ARGV[0];
23usage() if (! defined $cvsworkdir);
24# Mit "." als Pfadangabe funktionieren diverse Funktionen nicht
25# => ersetzen durch vollständigen absoluten Pfad
26if ($cvsworkdir eq ".") {
27 $cvsworkdir = $ENV{'PWD'};
28}
29
30# abschließenden "/" entfernen, falls vorhanden
31$cvsworkdir =~ s/\/$//g;
32
33(-d $cvsworkdir) || die "Fehler: $cvsworkdir ist kein Verzeichnis!";
34
35
36my %changedfiles = ();
37
38File::Find::find(\&cvscheck, $cvsworkdir);
39
40# Liste der geänderten Files ausgeben, falls nicht leer
41# Anzahl Elemente im Hash???
42my @changedfiles = keys %changedfiles;
43
44if ($#changedfiles > -1) {
45 print "Geänderte Dateien:\n";
46 foreach my $key (keys %changedfiles) {
47 print "$key\n";
48 }
49 if (I_am_interactive()) {
50 print "Die Dateien nach $cvsworkdir kopieren? (j/n)";
51 my $line = <STDIN>;
52 chomp($line);
53 if ($line eq "j") {
54 print "kopiere...\n";
55 foreach my $key (keys %changedfiles) {
56 print "$key --> $changedfiles{$key} ";
57 copy($key, $changedfiles{$key}) || print "(fehlgeschlagen)";
58 print "\n";
59 }
60 print "bitte noch manuell cvs commit ... ausführen.\n";
61 # CVS Environment prüfen
62 print "Hinweis: CVSROOT nicht gesetzt\n" unless defined $ENV{'CVSROOT'};
63 }
64 }
65}
66else {
67 print "keine geänderten Dateien in $cvsworkdir gefunden.\n";
68}
69print "\n";
70
71sub cvscheck {
72 return unless -f; # keine Directories
73 return if $File::Find::dir =~ /\/CVS$/; # ignoriere CVS-Verzeichnisse
74 my $cvsworkfile = "$File::Find::dir/$_";
75 #print "$cvsworkfile\n";
76 # Ursprungspfad ermitteln
77 $cvsworkfile =~ /${cvsworkdir}\/(.+)/;
78 my $realfile = "/" . $1;
79 # relativer Pfad zur CVS-Arbeitsdatei
80 my $relcvsworkfile = $1;
81 (-r $realfile) || die("Fehler: $realfile existiert nicht oder ist nicht lesbar");
82 (-r "$cvsworkfile") || die("Fehler: $cvsworkfile ist nicht lesbar");
83 if (compare($cvsworkfile,$realfile) != 0) {
84 # Dateien unterscheiden sich
85 (-w $cvsworkfile) || die("Fehler: kein Schreibrecht auf $cvsworkfile");
86 # Arbeitskopie durch Kopie ersetzen
87 #copy($realfile,$cvsworkfile) || die("Fehler beim kopieren $realfile --> $cvsworkfile");
88 $changedfiles{"$realfile"} = $cvsworkfile;
89 }
90}
91
92
93sub I_am_interactive {
94 local *TTY; # local file handle
95 open(TTY, "/dev/tty") or die "can't open /dev/tty: $!";
96 my $tpgrp = tcgetpgrp(fileno(TTY));
97 my $pgrp = getpgrp();
98 close TTY;
99 return ($tpgrp == $pgrp);
100}
101
102sub usage {
103print <<EOF;
104Funktion dieses Scripts:
105Es sollen Konfigurationsdatei (z.B. in /etc und /var) im CVS gepflegt werden.
106Überprüfen welche Dateien sich gegenüber der CVS-Arbeitskopie geändert haben
107und kopiert diese auf Wunsch in das CVS-Arbeitsverzeichnis
108
109Parameter: CVS-Arbeitsverzeichnis
110 (dort muß die Verzeichnisstruktur bezogen auf / abgebildet sein,
111 z.B. etc, var usw.
112
113EOF
114exit 1;
115}
Note: See TracBrowser for help on using the repository browser.