Mention smart-make in a comment.
[rsync.git] / support / instant-rsyncd
blob8bcfd001891017961a0df1b4e8f8ebb684d0a5d5
1 #!/usr/bin/env bash
3 # instant-rsyncd lets you quickly set up and start a simple, unprivileged rsync
4 # daemon with a single module in the current directory. I've found it
5 # invaluable for quick testing, and I use it when writing a list of commands
6 # that people can paste into a terminal to reproduce a daemon-related bug.
7 # Sysadmins deploying an rsync daemon for the first time may find it helpful as
8 # a starting point.
10 # Usage: instant-rsyncd MODULE PORT RSYNCD-USERNAME [RSYNC-PATH]
11 # The script asks for the rsyncd user's password twice on stdin, once to set it
12 # and once to log in to test the daemon.
13 # -- Matt McCutchen <matt@mattmccutchen.net>
15 set -e
17 dir="$(pwd)"
19 echo
20 echo "This will setup an rsync daemon in $dir"
22 if [ $# = 0 ]; then
23 IFS='' read -p 'Module name to create (or return to exit): ' module
24 [ ! "$module" ] && exit
25 else
26 module="$1"
27 shift
30 if [ $# = 0 ]; then
31 IFS='' read -p 'Port number the daemon should listen on [873]: ' port
32 else
33 port="$1"
34 shift
36 [ "$port" ] || port=873
38 if [ $# = 0 ]; then
39 IFS='' read -p 'User name for authentication (empty for none): ' user
40 else
41 user="$1"
42 shift
45 if [ "$user" ]; then
46 IFS='' read -s -p 'Desired password: ' password
47 echo
50 rsync="$1"
51 [ "$rsync" ] || rsync=rsync
53 moduledir="${dir%/}/$module"
55 mkdir "$module"
57 cat >rsyncd.conf <<EOF
58 log file = rsyncd.log
59 pid file = rsyncd.pid
60 port = $port
61 use chroot = no
63 [$module]
64 path = $module
65 read only = false
66 EOF
68 if [ "$user" ]; then
69 cat >>rsyncd.conf <<-EOF
70 auth users = $user
71 secrets file = $module.secrets
72 EOF
73 touch "$module".secrets
74 chmod go-rwx "$module".secrets
75 echo "$user:$password" >"$module".secrets
76 user="$user@"
79 cat >start <<EOF
80 #!/bin/bash
81 set -e
82 cd \`dirname \$0\`
83 ! [ -e rsyncd.pid ] || {
84 echo "Is the daemon already running? If not, delete rsyncd.pid."
85 exit 1
87 $rsync --daemon --config=rsyncd.conf
88 EOF
89 chmod +x start
91 cat >stop <<"EOF"
92 #!/bin/bash
93 set -e
94 cd `dirname $0`
95 ! [ -e rsyncd.pid ] || kill -s SIGTERM $(< rsyncd.pid)
96 EOF
97 chmod +x stop
99 path="rsync://$user$(hostname):$port/$module/"
101 if ./start; then
102 sleep .2
103 echo
104 echo "I ran the start command for the daemon. The log file rsyncd.log says:"
105 echo
106 cat rsyncd.log
107 echo
108 echo "You can start and stop it with ./start and ./stop respectively."
109 echo "You can customize the configuration file rsyncd.conf."
110 echo
111 echo "Give rsync the following path to access the module:"
112 echo " $path"
113 echo
114 if [ "$user" ]; then
115 echo "Let's test the daemon now. Enter the password you chose at the prompt."
116 else
117 echo "Let's test the daemon now."
119 echo
120 echo '$' $rsync --list-only "$path"
121 $rsync --list-only "$path"
122 echo
123 echo "You should see an empty folder; it's $moduledir."
124 else
125 echo "Something went wrong. Do you see an error message?"