chiark / gitweb /
991b060a04a6eaa7be1e4d3012577226a9eb3904
[disorder] / scripts / setup.in
1 #! /bin/bash
2 #
3 # This file is part of DisOrder
4 # Copyright (C) 2008 Richard Kettlewell
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 # USA
20 #
21
22 set -e
23
24 echo
25 echo ------------------------------------------------------------------------
26 echo "DisOrder setup script"
27
28 case $(uname -s) in
29 Darwin )
30   echo "Mac OS X detected"
31   os=Mac
32   # TODO we should use jukebox and create it if necessary; see below
33   user=daemon
34   group=daemon
35   ;;
36 FreeBSD )
37   echo "FreeBSD detected"
38   os=FreeBSD
39   user=jukebox
40   group=jukebox
41   ;;
42 Linux )
43   if grep Debian /etc/issue >/dev/null 2>&1; then
44     echo "You appear to be running Debian - please use .debs instead"
45     exit 1
46   fi
47   if grep Ubuntu /etc/issue >/dev/null 2>&1; then
48     echo "You appear to be running Ubuntu - please use .debs instead"
49     exit 1
50   fi
51   echo "Linux detected"
52   os=Linux
53   user=jukebox
54   group=jukebox
55   ;;
56 * )
57   echo 
58   echo "WARNING: unknown operating system '$(uname -s)'"
59   echo "This script won't be able to do all setup on this platform"
60   os=unknown
61   user=daemon
62   group=daemon
63   ;;
64 esac
65
66 echo
67 echo "This script will:"
68 echo " - overwrite any existing configuration"
69 case $os in
70 Mac )
71   echo " - set the server up to be run at boot time"
72   echo " - start the server"
73   ;;
74 esac
75 echo
76 echo "If this is not what you want, press ^C."
77 echo ------------------------------------------------------------------------
78
79 while :; do
80   echo
81   echo "What directory or directories contain your music files:"
82   echo "(enter one or more directories separated by spaces)"
83   read -r roots
84   ok=true
85   for root in $roots; do
86     if [ ! -d $root ]; then
87       echo "'$root' does not exist"
88       ok=false
89     fi
90   done
91   if $ok; then
92     break
93   fi
94 done
95
96 if [ -z "$encoding" ]; then
97   echo 
98   echo "What filesystem encoding should I assume for track names?"
99   echo "(e.g. UTF-8, ISO-8859-1, ...)"
100   read -r encoding
101 fi
102
103 while :; do
104   echo
105   echo "What TCP port should DisOrder listen on?"
106   echo "(enter 'none' for none)"
107   read -r port
108   case $port in
109   none )
110     break
111     ;;
112   [^0-9] )
113     echo "'$port' is not a valid port number"
114     continue
115     ;;
116   * )
117     break
118     ;;
119   esac
120 done
121
122 echo
123 echo "What host should DisOrder use as an SMTP server?"
124 read -r smtp_server
125   
126 echo
127 echo "What address should mail from DisOrder come from?"
128 read -r mail_sender
129
130 echo
131 echo "Proposed DisOrder setup:"
132 echo " Music directory:       $roots"
133 if [ $port = none ]; then
134   echo " Do not listen on a TCP port"
135 else
136   echo " TCP port to listen on: $port"
137 fi
138 echo " SMTP Server:           $smtp_server"
139 echo " Sender address:        $mail_sender"
140
141 echo "Is this OK?  (Enter 'y' or 'n')"
142 read -r ok
143 case $ok in
144 y )
145   ;;
146 * )
147   echo
148   echo "OK, didn't change anything."
149   exit 0
150   ;;
151 esac
152
153 mkdir -p pkgconfdir
154
155 rm -f pkgconfdir/config.new
156 for root in $roots; do
157   echo "collection fs $encoding $root" >> pkgconfdir/config.new
158 done
159 for scratch in slap.ogg scratch.ogg; do
160   echo "scratch pkgdatadir/$scratch" >> pkgconfdir/config.new
161 done
162 echo "user $user" >> pkgconfdir/config.new
163 if [ $port != none ]; then
164   echo "listen 0.0.0.0 $port" >> pkgconfdir/config.new
165 fi
166 echo "smtp_server $smtp_server" >> pkgconfdir/config.new
167 echo "mail_sender $mail_sender" >> pkgconfdir/config.new
168
169 echo
170 echo "Proposed pkgconfdir/config:"
171 sed < pkgconfdir/config.new 's/^/  /'
172 echo
173 echo "Is this OK?  (Enter 'y' or 'n')"
174 read -r ok
175 case $ok in
176 y )
177   ;;
178 * )
179   echo
180   echo "OK, not installing it."
181   rm -f pkgconfdir/config.new
182   exit 0
183   ;;
184 esac
185 echo
186 echo "Installing pkgconfdir/config"
187 mv pkgconfdir/config.new pkgconfdir/config
188
189 if [ ! -f pkgconfdir/options.user ]; then
190   echo "Making sure pkgconfdir/options.user exists"
191   touch pkgconfdir/options.user
192 fi
193
194 case $os in
195 Mac )
196   # TODO niutil?
197   ;;
198 FreeBSD )
199   if pw groupshow $group >/dev/null 2>&1; then
200     echo "$group group already exists"
201   else
202     echo "Creating $group group"
203     pw groupadd $group
204   fi
205   if pw usershow $user >/dev/null 2>&1; then
206     echo "$user user already exists"
207   else
208     echo "Creating $user user"
209     pw useradd $user -w no -d pkgstatedir -g $group -c 'DisOrder user'
210   fi
211   ;;
212 Linux )
213   if grep ^$group: /etc/group >/dev/null; then
214     echo "$group group already exists"
215   else
216     echo "Creating $group group"
217     groupadd $group
218   fi
219   if grep ^$user: /etc/passwd >/dev/null; then
220     echo "$user user already exists"
221   else
222     echo "Creating $user user"
223     useradd -d pkgstatedir -g $group $user -c 'DisOrder user'
224   fi
225   ;;
226 esac
227
228 echo "Making sure that pkgstatedir exists"
229 mkdir -p pkgstatedir
230 chown $user:$group pkgstatedir
231 chmod 2755 pkgstatedir
232
233 case $os in
234 Mac )
235   echo "Installing the plist into /Library/LaunchDaemons"
236   cp server/uk.org.greenend.rjk.disorder.plist /Library/LaunchDaemons/.
237   echo "Reloading launchd"
238   launchctl load /Library/LaunchDaemons
239   echo "Starting DisOrder server"
240   launchctl start uk.org.greenend.rjk.disorder
241   echo "Installing CGI"
242   install -m 555 server/disorder.cgi /Library/WebServer/CGI-Executables/disorder
243   echo "Setting up link to CGI's dependencies"
244   rm -f /Library/WebServer/Documents/disorder
245   ln -s pkgdatadir/static /Library/WebServer/Documents/disorder
246   echo
247   echo "You must sudo disorder setup-guest [--no-online-registration] next."
248   ;;
249 FreeBSD )
250   echo "Installing startup script into /etc/rc.d"
251   install -m 555 examples/disorder.rc /etc/rc.d/disorder
252   echo "Starting DisOrder server"
253   /etc/rc.d/disorder start
254   echo "Identifying web server"
255   set /usr/local/www/*
256   case $# in
257   0 )
258     echo
259     echo "Could not find a web server"
260     exit 1
261     ;;
262   1 )
263     ;;
264   * )
265     echo
266     echo "Yikes!  There seems to be more than one web server here."
267     echo "Guessing that you want $1."
268     echo
269     ;;
270   esac
271   web=$1
272   echo "Found $web"
273   echo "Installing CGI"
274   install -m 555 server/disorder.cgi $web/cgi-bin/disorder
275   echo "Setting up link to CGI's dependencies"
276   rm -f $web/data/disorder
277   ln -s pkgdatadir/static $web/data/disorder
278   echo
279   echo "You must sudo disorder setup-guest [--no-online-registration] next."
280   ;;
281 * )
282   echo "Sorry, I don't know how to install the server on this platform."
283   echo "You will have to do that by hand."
284   exit 1
285   ;;
286 esac