#!/usr/bin/perl use strict; use warnings FATAL => 'all'; use constant LOGFILE => '/var/log/rsync-shell.log'; my %commands = ( "backup" => \&backup, "rsync" => \&rsync, ); sub backup { exec '/usr/bin/sudo', '/afs/hcoop.net/common/etc/scripts/hcoop-backup-wrapper'; } sub rsync { my ($cmdline) = @_; if ( $cmdline !~ m!^--server --sender -vre\.iL --bwlimit=325 \. /vicepa/hcoop-backups/files/[0-9]{4}\.[0-9]{2}\.[0-9]{2}$!s ) { die "Incorrect arguments to rsync.\n"; } exec '/usr/bin/rsync', split(' ', $cmdline) or die "Could not run rsync command.\n"; } sub main { -f LOGFILE && open (LOG, '>>', LOGFILE) or die "Can't open log file.\n"; print LOG "Session started on ", `date`; print LOG "Commands: ", map { "<$_> " } @ARGV; print LOG "\n"; $ARGV[1] =~ /^([^ ]+) *(.*?)$/s; my $cmd = $commands{$1} or die "Unsupported command.\n"; $cmd->($2); } main()