126 lines
2.7 KiB
Bash
Executable file
126 lines
2.7 KiB
Bash
Executable file
#!/bin/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
|