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

Listing 2 do_rsync

#!/usr/local/bin/perl
#
###########################################################################
#
#  do_rsync
#
#  Author:  Lisa Hamet Bernard, IT consultant, 8/6/2004
#
#  The purpose of this script is to provide a web interface to allow the
#  Webmaster to selectively deploy files from the development website 
#  to the production websites.  The backend tool used is rsync.
#
###########################################################################

#user is login for ssh destination server, $dest
# Don't forget trailing slash in source dir for rsync 
$user = "webmaster";
$dest = "\@web1.agency.org:";
$devdir = "/app/website/";
$proddir = "/app/website"; 
$basedir = "/tmp/";  # base directory to put rsync output
$filename = "rsynclist.txt";  #name of rsync output file
             
#Create temporary output file
system "/usr/bin/touch","$basedir$filename";

# Run rsync in dry-run mode to generate list of potential files to be copied
# (Do it via sudo as user webmaster, which can access the remote server via 
# ssh with preshared keys. Then no password needs to be supplied.)

`/usr/local/bin/sudo -u webmaster /usr/local/bin/rsync --recursive \\
  --rsh=/usr/local/bin/ssh --dry-run --archive --update \\
  --exclude-from=/usr/local/apache/cgi-bin/exclude_list.txt $devdir \\
  $user$dest$proddir > $basedir$filename`;

# Put all of the output from rsync in a form consisting of a table with 
# check boxes and submit and reset buttons

    &open_file("FILE1","","$basedir$filename");
    $counter = 0;

    print "Content-type: text/html\n\n";
    print "<HTML>\n";
    print "<BODY BGCOLOR=#FFFFFF TEXT=#000000 LINK=#0000FF VLINK=#800040 
      ALINK=#800040>\n";
    print "<TITLE>Production file deployment list</TITLE>\n";
    print "<CENTER>\n";
    print "<form id=rsyncfiles action=/cgi-bin/move2prod method=post 
      name=rsyncfiles enctype=Default>\n";
    print "<TABLE width=521 border=1 cellpadding=0 cellspacing=2>\n";
    print "<TH Colspan=2 title=Production file deployment list</TH>\n";

     print "<tr>\n";
     print "<td align=center><b>Select files to be moved</b></td>\n";
     print "<td align=center><b>Candidate files</b></td>\n";
     print "</tr>\n";

    while ($line = &read_file("FILE1")) {
        if (($line =~ /^building\b/) || ($line =~ /^wrote\b/) || 
          ($line =~ /^total\b/) || ($line =~ /^$/) || ($line =~ 
          /^Sun\bMicro/)) {
        # ignore informational output from rsync and OpenSSH
}
        else {
     print "<tr>\n";
     print "<td align=center><input type=checkbox name=file$counter \\
       value=$counter></td>\n";
     print "<td nowrap>$line</td>\n";
     print "</TR>\n";
        }
     $counter++;
    }
    close(FILE1);
    if ($counter == 0) {
       print "<B> Development and production sites are identical.<eB>\n";
    }

    print "</TABLE>\n";
    print ("<p><input type=submit name=submitButton \\
      value=\"Move selected files\"><spacer size=32 type=horizontal> \\
      <input type=reset value=Reset></p>\n");
    print "</form>\n";
    print "</CENTER>\n";
    print "</BODY></HTML>\n";

sub open_file {

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

sub read_file {

  local ($filevar) = @_;

  <$filevar>;  
}