Perl script to publish web content from test to prod via ssh (linux with apache)
Requirements - public key auth for ssh between the 2 servers
create file /etc/fpub.allowed on test server with:
#source:destination paths
/web/docs:/web/docs
create file /usr/bin/fpub with:
#!/usr/bin/perl -wuse strict;
use Cwd qw(abs_path);
use Sys::Syslog qw(:standard :macros);use File::Spec;openlog('fpub', 'ndelay', LOG_USER);
# User to run as, system to scp to (should be put in a config file)
my $user = 'unixuser';my $target = 'destinationservername';my $relfile = $ARGV[0];
# Make sure that a file was specified
if (! $relfile) {print "No file specified for publishing.\n";print "Usage: fpub /file/to.publish\n";print "Also, use \"fpub list_allowed\" to see allowed publishing locations.\n";exit 1;}# List allowed publish locations if requested by the user
if ($relfile eq 'list_allowed') {print "Listing allowed publish locations:\n\n";open ALLOW, '/etc/fpub.allowed' or die "Could not open allowed locations file /etc/fpub.allowed: $!";while (<ALLOW>) {
print $_;}close ALLOW;
print "\n";
exit 0;
}# Get the absolute path of the file
my $file = File::Spec->rel2abs($relfile);print "Publishing file: $file\n";
my $username = getpwuid($>);
syslog(LOG_INFO, "fpub ($username) publishing file $file");my $scpret = system("sudo -u $user fpub_scp $file $target");
if ($scpret == 100) {
syslog(LOG_ERR, "fpub ($username) fpub.allowed error, could not publish file: $file");} elsif ($scpret == 120) {syslog(LOG_WARNING, "fpub ($username) publish disallowed for file: $file");} elsif ($scpret == 130) {syslog(LOG_ERR, "fpub ($username) fpub.allowed contains relative paths");} elsif ($scpret != 0) {syslog(LOG_ERR, "fpub ($username) unspecified error. File: $file");}closelog();
Use examples:
fpub index.html #from within the directory where index.html exists
find . -type f -mtime -1 -exec fpub {} \; #to publish all docs updated within last 24 hours
No comments:
Post a Comment