#!/bin/bash # This script makes it easy to update the ftp & html directories on the samba.org server. # It expects the 2 *_DEST directories to contain updated files that need to be sent to # the remote server. If these directories don't exist yet, they will be copied from the # remote server (while also making the html dir a git checkout). FTP_SRC="$HOME/samba-rsync-ftp" HTML_SRC="$HOME/samba-rsync-html" FTP_DEST="/home/ftp/pub/rsync" HTML_DEST="/home/httpd/html/rsync" HTML_GIT='git.samba.org:/data/git/rsync-web.git' export RSYNC_PARTIAL_DIR='' case "$RSYNC_SAMBA_HOST" in *.samba.org) ;; *) echo "You must set RSYNC_SAMBA_HOST in your environment to the samba hostname to use." >&2 exit 1 ;; esac MODE='' REVERSE='' while (( $# )); do case "$1" in -R|--reverse) REVERSE=yes ;; f|ftp) MODE=ftp ;; h|html) MODE=html ;; -h|--help) echo "Usage: [-R] [f|ftp|h|html]" echo "-R --reverse Copy the files from the server to the local host." echo " The default is to update the remote files." echo "-h --help Output this help message." echo " " echo "The script will prompt if ftp or html is not specified on the command line." echo "Only one category can be copied at a time. When pulling html files, a git" echo "checkout will be either created or updated prior to the rsync copy." exit ;; *) echo "Invalid option: $1" >&2 exit 1 ;; esac shift done while [ ! "$MODE" ]; do if [ "$REVERSE" = yes ]; then DIRECTION=FROM else DIRECTION=TO fi echo -n "Copy which files $DIRECTION the server? ftp or html? " read ans case "$ans" in f*) MODE=ftp ;; h*) MODE=html ;; '') exit 1 ;; *) echo "You must answer f or h to copy the ftp or html data." ;; esac done if [ "$MODE" = ftp ]; then SRC_DIR="$FTP_SRC" DEST_DIR="$FTP_DEST" FILT=".filt" else SRC_DIR="$HTML_SRC" DEST_DIR="$HTML_DEST" FILT="filt" fi function do_rsync { rsync --dry-run "${@}" | grep -v 'is uptodate$' echo '' echo -n "Run without --dry-run? [n] " read ans case "$ans" in y*) rsync "${@}" | grep -v 'is uptodate$' ;; esac } if [ -d "$SRC_DIR" ]; then REVERSE_RSYNC=do_rsync else echo "The directory $SRC_DIR does not exist yet." echo -n "Do you want to create it? [n] " read ans case "$ans" in y*) ;; *) exit 1 ;; esac REVERSE=yes REVERSE_RSYNC=rsync fi if [ "$REVERSE" = yes ]; then OPTS='-aivOHP' TMP_FILT="$SRC_DIR/tmp-filt" echo "Copying files from $RSYNC_SAMBA_HOST to $SRC_DIR ..." if [ "$MODE" = html ]; then if [ $REVERSE_RSYNC = rsync ]; then git clone "$HTML_GIT" "$SRC_DIR" || exit 1 else cd "$SRC_DIR" || exit 1 git pull || exit 1 fi sed -n -e 's/[-P]/H/p' "$SRC_DIR/$FILT" >"$TMP_FILT" OPTS="${OPTS}f._$TMP_FILT" else OPTS="${OPTS}f:_$FILT" fi $REVERSE_RSYNC "$OPTS" "$RSYNC_SAMBA_HOST:$DEST_DIR/" "$SRC_DIR/" rm -f "$TMP_FILT" exit fi cd "$SRC_DIR" || exit 1 echo "Copying files from $SRC_DIR to $RSYNC_SAMBA_HOST ..." do_rsync -aivOHP --chown=:rsync --del -f._$FILT . "$RSYNC_SAMBA_HOST:$DEST_DIR/"