dcd875774c738081d4b0b17eaed0270fa5ba7042
[rsync/rsync.git] / support / instant-rsyncd
1 #!/bin/bash
2
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.
9 #
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>
14
15 set -e
16
17 dir="$(pwd)"
18
19 if [ "$#" -lt 3 ]; then
20         echo "I would install an rsync daemon in $dir if you gave me"
21         echo "a module name, a port, and an rsync username."
22         exit 1
23 fi
24
25 module="$1"
26 port="$2"
27 user="$3"
28 rsync="$4"
29 if [ ! "$rsync" ]; then
30         rsync=rsync
31 fi
32
33 moduledir="${dir%/}/$module"
34
35 echo
36 echo "I'm about to install an rsync daemon in $dir."
37 echo "It will listen on port $port for requests giving rsync username $user"
38 echo "and the password you are about to specify.  It will serve a module"
39 echo "$module corresponding to $moduledir."
40 echo
41
42 IFS='' read -s -p 'Desired password: ' password
43
44 mkdir "$module"
45
46 cat >rsyncd.conf <<EOF
47 log file = rsyncd.log
48 pid file = rsyncd.pid
49 port = $port
50 use chroot = no
51
52 [$module]
53         path = $module
54         read only = false
55         auth users = $user
56         secrets file = $module.secrets
57 EOF
58
59 touch "$module".secrets
60 chmod go-rwx "$module".secrets
61 cat >"$module".secrets <<EOF
62 $user:$password
63 EOF
64
65 cat >start <<EOF
66 #!/bin/bash
67 set -e
68 cd \`dirname \$0\`
69 ! [ -e rsyncd.pid ] || {
70         echo "Is the daemon already running?  If not, delete rsyncd.pid."
71         exit 1
72 }
73 $rsync --daemon --config=rsyncd.conf
74 EOF
75 chmod +x start
76
77 cat >stop <<"EOF"
78 #!/bin/bash
79 set -e
80 cd `dirname $0`
81 ! [ -e rsyncd.pid ] || kill -s SIGTERM $(< rsyncd.pid)
82 EOF
83 chmod +x stop
84
85 path="rsync://$user@$(hostname):$port/$module/"
86
87 if ./start; then
88         sleep .2
89         echo
90         echo "I tried to start the daemon.  The log file rsyncd.log says:"
91         echo
92         cat rsyncd.log
93         echo
94         echo "You can start and stop it with ./start and ./stop respectively."
95         echo "You can customize the configuration file rsyncd.conf."
96         echo
97         echo "Give rsync the following path to access the module:"
98         echo "    $path"
99         echo
100         echo "Let's test the daemon now.  Enter the password you chose."
101         echo '$' $rsync --list-only "$path"
102         $rsync --list-only "$path"
103         echo
104         echo "You should see an empty folder; it's $moduledir."
105 else
106         echo "Something went wrong.  Do you see an error message?"
107 fi