#!/usr/bin/perl -w =head1 NAME disklist-builder.pl - Build disklist definitions for Amanda backup =cut use POSIX qw(strftime); use strict; =head1 SYNOPSIS B [ B [ B ] ] =cut my $hosts_file = shift; my $disklist_file = shift; =head1 DESCRIPTION disklist-build.pl is my idea of templating system for disklist definitions for Amanda backup software. This script should help you in building disklist files when you need to manage a large number of hosts, which are similar in some ways and different in others. Consider an example of /home partition being mounted from central NFS server by some of your servers. Those, which mount the central /home partition, need it to be excluded from the disklist, since it's already included with NFS server disklist entry. Instead, you might want to backup /localhome partition, if system has one. In order to construct disklist for your network, create a host definition file, e.g. "hosts.list", which looksl like this: # The format of the host definition file is: # # Hostname Template server1.mydomain.com unix-default server2.mydomain.com unix-default,unix-nfs Above configuration will create Amanda disklist entries using C template for server1 and server2 of your mydomain.com. Disklist entries for server2 will be modified by C template. Now you just need to create two templates. Sample C template may look like this: # The format of the template is: # # [-]Disk Dumptype /bin system-vital /boot system-vital /dev system-vital /etc system-vital /home system-home /opt system-binaries /usr system-binaries /var system-var Now, C might look like: # The format of the template is: # # [-]Disk Dumptype -/home system-home /localhome system-home Dumptype column in template definition should be the same as the one you have defined in Amanda configuration file. Disk column should be also the same as you used to define in Amanda disklist file before. If you precede the disk with a minus ("-") character, then it will be deleted from the disklist. All empty lines and lines that start with the hash ("#") sign are ignored in both host definition file and templates. All files are processed from top to bottom, and from left to right. =cut =head1 FILES =over =item hosts.list If no host definition file has been specified on the command line, then disklist-builder.pl tries to use C file in the current directory. =item disklist If no disklist (i.e. result) file has been specified, then disklist-builder.pl will create file C in the current directory. =item templates The names of the templates you use in the host definition file are also the names of files. If you no directory has been specified, then templates are expected to be found in the current directory. =back =cut # Defaults. $hosts_file = "hosts.list" if (!defined($hosts_file)); $disklist_file = "disklist" if (!defined($disklist_file)); open(DISKLIST,">$disklist_file") || die "open disklist $disklist_file: $!"; # Print some header to the file print DISKLIST "# This is disklist definition file for Amanda backup.\n"; print DISKLIST "# Generated by disklist-builder.pl\n"; print DISKLIST "# Generated at ".strftime("%H:%M:%S %d/%m/%Y",localtime(time))."\n"; print DISKLIST "\n"; open(HOSTS, $hosts_file) || die "open hosts file $hosts_file: $!"; while (my $host_line = ) { chomp($host_line); next if ($host_line =~ /^\s*$/); # Skip empty lines next if ($host_line =~ /^#/); # Skip comments my ($host,$config_list) = split(/\s+/, $host_line); # Process all proper hosts if ($host ne "") { # Cleanup whitespaces $host =~ s/\s+//g; $config_list =~ s/\s+//g; # Print a comment print DISKLIST "#",$host,"\n"; # Get a list of config files to process for the host. my @configs = split(/,/, $config_list); my %disk_list = (); foreach my $config_file (@configs) { open (CONFIG, $config_file) || die "open config file ($config_file): $!"; while (my $disklist_line=) { chomp($disklist_line); next if ($disklist_line =~ /^\s*$/); # Skip empty lines next if ($disklist_line =~ /^#/); # Skip comments my ($disk,$dumptype) = split(/\s+/, $disklist_line); # Add/delete disks to/from disklist if ($disk =~ /^-/) { $disk =~ s/^-//; delete $disk_list{$disk}; } else { $disk_list{$disk} = $dumptype; } } close (CONFIG); } # Print resulting disklist for current host to file foreach my $disk (sort keys %disk_list) { print DISKLIST $host,"\t",$disk,"\t",$disk_list{$disk},"\n"; } print DISKLIST "\n"; } } close(HOSTS); close(DISKLIST); =head1 TODO =over =item Execute/Include/Parse templates Currently, templates are only parsed. Sometimes it would be easier to execute some program and use it's output in the disklist. In some other cases, no parsing or external processing is required, but rather a simple include of part of disklist file. =item Comments inclusion Currently, all comments in templates and host definition files are ignored. I think that they should kind of be passed into resulting disklist file. Needs more consideration. =item Proper documentation =back =head1 BUGS None that I know of. =head1 VERSION $Id: disklist-builder.pl,v 1.2 2003/05/29 13:49:36 leonid Exp $ =head1 AUTHOR Leonid Mamtchenkov =cut