Article Figure 1 Figure 2 Listing 1 Listing 2
Listing 3 mar2005.tar

Listing 3 move2prod

#!/usr/local/bin/perl
###########################################################################
#
# move2prod
#
# Author:  Lisa Hamet Bernard, IT Consultant, 8/6/2004
#
# This script is the back end of the do_rsync script, which enables the
# Webmaster to selectively deploy files from the development website to the 
# production websites.  The do_rsync script passes this script the list of 
# indexes of the files to be moved, referencing /tmp/rsynclist.txt.  This
# script performs the rsync for those files, after making timestamped 
# copies of any named files that already exist on production.
#
###########################################################################
use CGI qw(:standard escapeHTML);
use CGI 'param';

# Redefine the user login and machine names of both production servers, the 
# development directory, the production directory, the temporary file 
# containing dry-run rsync output from do_rsync and the temporary file in 
# which to write files to be copied.

$user = "webmaster";
$dest1 = "\@web1.agency.org:";
$dest2 = "\@web2.agency.org:";
$devdir = "/app/website/";
$proddir = "/app/website";
$basedir = "/tmp/";
$filename = "rsynclist.txt";
$cpfilename = "copylist.txt";

# get the file index list from the do_rsync form
my @fileindex = param();

&open_file("FILE1","","$basedir$filename");
# Read contents of rsync dry-run into an array
@filelist = <FILE1>;

# output the HTML
print header(), start_html("Development files deployment completion");

# If at least one filename parameter passed, open output file
if ($#fileindex > 0) {
   &open_file("FILE2",">","$basedir$cpfilename");
}

# For each parameter passed, get its value and use it as an index into 
# filelist, then write that filename to a second temp file containing the 
# list of only those files that are to be deployed.

 for ($i=0; $i<$#fileindex; $i++)  {
       $filenum = param($fileindex[$i]);
       $rsyncfile = $filelist[$filenum];
       print FILE2 $rsyncfile;
}

close(FILE1);
close(FILE2);
unlink($basedir.$filename);

# Get timestamp string (in mmddyyHHMM format) to use for rsync suffix.

$timestamp = `date '+%m%d%y%H%M'`;
chomp($timestamp);
$suffix = "." . $timestamp;

# Do the rsync from development to the production servers using 
# /tmp/copylist as list of files to include.  Use sudo so rsync executes as 
# user webmaster (on remote server), who has preshared ssh keys between 
# this server and the production servers. Use the archive option to 
# preserve all file attributes.  Use the combination of the backup and s
# uffix options to make copies of existing files on the production server 
# with the timestamp suffix before replacing.

`/usr/local/bin/sudo -u webmaster /usr/local/bin/rsync \\
  --rsh=/usr/local/bin/ssh --archive --update --relative \\
  --backup --suffix=$suffix --files-from=$basedir$cpfilename $devdir \\
  $user$dest1$proddir`;

# Repeat above for second production server

`/usr/local/bin/sudo -u webmaster /usr/local/bin/rsync \\
  --rsh=/usr/local/bin/ssh --archive --update --relative \\
  --backup --suffix=$suffix --files-from=$basedir$cpfilename $devdir \\
  $user$dest2$proddir`;

# Delete temp file
unlink($basedir.$cpfilename);
             
print p("rsync operation is complete.  ", $#fileindex, " files deployed \\
  to production.");

print end_html();

sub open_file {

  local ($filevar, $filemode, $filename) = @_;
  
  open ($filevar, $filemode . $filename) ||
     die ("Can't open $filename");
}