summaryrefslogtreecommitdiffstats
path: root/support/instant-rsyncd
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsupport/instant-rsyncd126
1 files changed, 126 insertions, 0 deletions
diff --git a/support/instant-rsyncd b/support/instant-rsyncd
new file mode 100755
index 0000000..8bcfd00
--- /dev/null
+++ b/support/instant-rsyncd
@@ -0,0 +1,126 @@
+#!/usr/bin/env bash
+
+# instant-rsyncd lets you quickly set up and start a simple, unprivileged rsync
+# daemon with a single module in the current directory. I've found it
+# invaluable for quick testing, and I use it when writing a list of commands
+# that people can paste into a terminal to reproduce a daemon-related bug.
+# Sysadmins deploying an rsync daemon for the first time may find it helpful as
+# a starting point.
+#
+# Usage: instant-rsyncd MODULE PORT RSYNCD-USERNAME [RSYNC-PATH]
+# The script asks for the rsyncd user's password twice on stdin, once to set it
+# and once to log in to test the daemon.
+# -- Matt McCutchen <matt@mattmccutchen.net>
+
+set -e
+
+dir="$(pwd)"
+
+echo
+echo "This will setup an rsync daemon in $dir"
+
+if [ $# = 0 ]; then
+ IFS='' read -p 'Module name to create (or return to exit): ' module
+ [ ! "$module" ] && exit
+else
+ module="$1"
+ shift
+fi
+
+if [ $# = 0 ]; then
+ IFS='' read -p 'Port number the daemon should listen on [873]: ' port
+else
+ port="$1"
+ shift
+fi
+[ "$port" ] || port=873
+
+if [ $# = 0 ]; then
+ IFS='' read -p 'User name for authentication (empty for none): ' user
+else
+ user="$1"
+ shift
+fi
+
+if [ "$user" ]; then
+ IFS='' read -s -p 'Desired password: ' password
+ echo
+fi
+
+rsync="$1"
+[ "$rsync" ] || rsync=rsync
+
+moduledir="${dir%/}/$module"
+
+mkdir "$module"
+
+cat >rsyncd.conf <<EOF
+log file = rsyncd.log
+pid file = rsyncd.pid
+port = $port
+use chroot = no
+
+[$module]
+ path = $module
+ read only = false
+EOF
+
+if [ "$user" ]; then
+ cat >>rsyncd.conf <<-EOF
+ auth users = $user
+ secrets file = $module.secrets
+ EOF
+ touch "$module".secrets
+ chmod go-rwx "$module".secrets
+ echo "$user:$password" >"$module".secrets
+ user="$user@"
+fi
+
+cat >start <<EOF
+#!/bin/bash
+set -e
+cd \`dirname \$0\`
+! [ -e rsyncd.pid ] || {
+ echo "Is the daemon already running? If not, delete rsyncd.pid."
+ exit 1
+}
+$rsync --daemon --config=rsyncd.conf
+EOF
+chmod +x start
+
+cat >stop <<"EOF"
+#!/bin/bash
+set -e
+cd `dirname $0`
+! [ -e rsyncd.pid ] || kill -s SIGTERM $(< rsyncd.pid)
+EOF
+chmod +x stop
+
+path="rsync://$user$(hostname):$port/$module/"
+
+if ./start; then
+ sleep .2
+ echo
+ echo "I ran the start command for the daemon. The log file rsyncd.log says:"
+ echo
+ cat rsyncd.log
+ echo
+ echo "You can start and stop it with ./start and ./stop respectively."
+ echo "You can customize the configuration file rsyncd.conf."
+ echo
+ echo "Give rsync the following path to access the module:"
+ echo " $path"
+ echo
+ if [ "$user" ]; then
+ echo "Let's test the daemon now. Enter the password you chose at the prompt."
+ else
+ echo "Let's test the daemon now."
+ fi
+ echo
+ echo '$' $rsync --list-only "$path"
+ $rsync --list-only "$path"
+ echo
+ echo "You should see an empty folder; it's $moduledir."
+else
+ echo "Something went wrong. Do you see an error message?"
+fi