Initial add of specialized Config modules. Some parts are not fully implemented.
[BackupPC.git] / lib / BackupPC / Config / Text.pm
diff --git a/lib/BackupPC/Config/Text.pm b/lib/BackupPC/Config/Text.pm
new file mode 100644 (file)
index 0000000..8ee2927
--- /dev/null
@@ -0,0 +1,198 @@
+package BackupPC::Config::Text;
+
+use warnings;
+use strict;
+use Fcntl qw/:flock/;
+
+use base 'BackupPC::Config';
+
+sub BackupInfoRead
+{
+    my($self, $host) = @_;
+    local(*BK_INFO, *LOCK);
+    my(@Backups);
+
+    flock(LOCK, LOCK_EX) if open(LOCK, "$self->{TopDir}/pc/$host/LOCK");
+    if ( open(BK_INFO, "$self->{TopDir}/pc/$host/backups") ) {
+        while ( <BK_INFO> ) {
+            s/[\n\r]+//;
+            next if ( !/^(\d+\t(incr|full)[\d\t]*$)/ );
+            $_ = $1;
+            @{$Backups[@Backups]}{@{$self->{BackupFields}}} = split(/\t/);
+        }
+        close(BK_INFO);
+    }
+    close(LOCK);
+    return @Backups;
+}
+
+sub BackupInfoWrite
+{
+    my($self, $host, @Backups) = @_;
+    local(*BK_INFO, *LOCK);
+    my($i);
+
+    flock(LOCK, LOCK_EX) if open(LOCK, "$self->{TopDir}/pc/$host/LOCK");
+    unlink("$self->{TopDir}/pc/$host/backups.old")
+                if ( -f "$self->{TopDir}/pc/$host/backups.old" );
+    rename("$self->{TopDir}/pc/$host/backups",
+           "$self->{TopDir}/pc/$host/backups.old")
+                if ( -f "$self->{TopDir}/pc/$host/backups" );
+    if ( open(BK_INFO, ">$self->{TopDir}/pc/$host/backups") ) {
+        for ( $i = 0 ; $i < @Backups ; $i++ ) {
+            my %b = %{$Backups[$i]};
+            printf(BK_INFO "%s\n", join("\t", @b{@{$self->{BackupFields}}}));
+        }
+        close(BK_INFO);
+    }
+    close(LOCK);
+}
+
+sub RestoreInfoRead
+{
+    my($self, $host) = @_;
+    local(*RESTORE_INFO, *LOCK);
+    my(@Restores);
+
+    flock(LOCK, LOCK_EX) if open(LOCK, "$self->{TopDir}/pc/$host/LOCK");
+    if ( open(RESTORE_INFO, "$self->{TopDir}/pc/$host/restores") ) {
+        while ( <RESTORE_INFO> ) {
+            s/[\n\r]+//;
+            next if ( !/^(\d+.*)/ );
+            $_ = $1;
+            @{$Restores[@Restores]}{@{$self->{RestoreFields}}} = split(/\t/);
+        }
+        close(RESTORE_INFO);
+    }
+    close(LOCK);
+    return @Restores;
+}
+
+sub RestoreInfoWrite
+{
+    my($self, $host, @Restores) = @_;
+    local(*RESTORE_INFO, *LOCK);
+    my($i);
+
+    flock(LOCK, LOCK_EX) if open(LOCK, "$self->{TopDir}/pc/$host/LOCK");
+    unlink("$self->{TopDir}/pc/$host/restores.old")
+                if ( -f "$self->{TopDir}/pc/$host/restores.old" );
+    rename("$self->{TopDir}/pc/$host/restores",
+           "$self->{TopDir}/pc/$host/restores.old")
+                if ( -f "$self->{TopDir}/pc/$host/restores" );
+    if ( open(RESTORE_INFO, ">$self->{TopDir}/pc/$host/restores") ) {
+        for ( $i = 0 ; $i < @Restores ; $i++ ) {
+            my %b = %{$Restores[$i]};
+            printf(RESTORE_INFO "%s\n",
+                        join("\t", @b{@{$self->{RestoreFields}}}));
+        }
+        close(RESTORE_INFO);
+    }
+    close(LOCK);
+}
+
+sub ConfigRead
+{
+    my($self, $host) = @_;
+    my($ret, $mesg, $config, @configs);
+    
+    our %Conf;
+
+    $self->{Conf} = ();
+    push(@configs, "$self->{TopDir}/conf/config.pl");
+    push(@configs, "$self->{TopDir}/pc/$host/config.pl")
+            if ( defined($host) && -f "$self->{TopDir}/pc/$host/config.pl" );
+    foreach $config ( @configs ) {
+        %Conf = ();
+        if ( !defined($ret = do $config) && ($! || $@) ) {
+            $mesg = "Couldn't open $config: $!" if ( $! );
+            $mesg = "Couldn't execute $config: $@" if ( $@ );
+            $mesg =~ s/[\n\r]+//;
+            return $mesg;
+        }
+        %{$self->{Conf}} = ( %{$self->{Conf} || {}}, %Conf );
+    }
+    
+    #$mesg = $self->CheckConfigInfo;
+    #return $mesg if $mesg;
+    
+    return if ( !defined($self->{Conf}{Language}) );
+    
+    my $langFile = "$self->{LibDir}/BackupPC/Lang/$self->{Conf}{Language}.pm";
+    
+    if ( !defined($ret = do $langFile) && ($! || $@) ) {
+        $mesg = "Couldn't open language file $langFile: $!" if ( $! );
+        $mesg = "Couldn't execute language file $langFile: $@" if ( $@ );
+        $mesg =~ s/[\n\r]+//;
+        return $mesg;
+    }
+    
+    our %Lang;
+    $self->{Lang} = \%Lang;
+    
+    return;
+}
+
+
+#
+# Return the mtime of the config file
+#
+sub ConfigMTime
+{
+    my($self) = @_;
+    return (stat("$self->{TopDir}/conf/config.pl"))[9];
+}
+
+#
+# Returns information from the host file in $self->{TopDir}/conf/hosts.
+# With no argument a ref to a hash of hosts is returned.  Each
+# hash contains fields as specified in the hosts file.  With an
+# argument a ref to a single hash is returned with information
+# for just that host.
+#
+sub HostInfoRead
+{
+    my($self, $host) = @_;
+    my(%hosts, @hdr, @fld);
+    local(*HOST_INFO);
+
+    if ( !open(HOST_INFO, "$self->{TopDir}/conf/hosts") ) {
+        print(STDERR $self->timeStamp,
+                     "Can't open $self->{TopDir}/conf/hosts\n");
+        return {};
+    }
+    while ( <HOST_INFO> ) {
+        s/[\n\r]+//;
+        s/#.*//;
+        s/\s+$//;
+        next if ( /^\s*$/ || !/^([\w\.-]+\s+.*)/ );
+        @fld = split(/\s+/, $1);
+        if ( @hdr ) {
+            if ( defined($host) ) {
+                next if ( lc($fld[0]) ne $host );
+                @{$hosts{lc($fld[0])}}{@hdr} = @fld;
+               close(HOST_INFO);
+                return \%hosts;
+            } else {
+                @{$hosts{lc($fld[0])}}{@hdr} = @fld;
+            }
+        } else {
+            @hdr = @fld;
+        }
+    }
+    close(HOST_INFO);
+    return \%hosts;
+}
+
+#
+# Return the mtime of the hosts file
+#
+sub HostsMTime
+{
+    my($self) = @_;
+    return (stat("$self->{TopDir}/conf/hosts"))[9];
+}
+
+
+
+1;