chiark / gitweb /
Finish off Mac support in scripts/setup.
[disorder] / scripts / setup.in
index 921cedf40a63512dae74653e3f374781f5ce7647..370013eba9f30fe7d7b378a3a1a7256b04b85a27 100755 (executable)
@@ -27,11 +27,35 @@ echo "DisOrder setup script"
 
 case $(uname -s) in
 Darwin )
-  os=mac
-  user=daemon
-  group=daemon
+  echo "Mac OS X detected"
+  os=Mac
+  user=jukebox
+  group=jukebox
+  ;;
+FreeBSD )
+  echo "FreeBSD detected"
+  os=FreeBSD
+  user=jukebox
+  group=jukebox
+  ;;
+Linux )
+  if grep Debian /etc/issue >/dev/null 2>&1; then
+    echo "You appear to be running Debian - please use .debs instead"
+    exit 1
+  fi
+  if grep Ubuntu /etc/issue >/dev/null 2>&1; then
+    echo "You appear to be running Ubuntu - please use .debs instead"
+    exit 1
+  fi
+  echo "Linux detected"
+  os=Linux
+  user=jukebox
+  group=jukebox
   ;;
 * )
+  echo 
+  echo "WARNING: unknown operating system '$(uname -s)'"
+  echo "This script won't be able to do all setup on this platform"
   os=unknown
   user=daemon
   group=daemon
@@ -42,7 +66,7 @@ echo
 echo "This script will:"
 echo " - overwrite any existing configuration"
 case $os in
-mac )
+Mac )
   echo " - set the server up to be run at boot time"
   echo " - start the server"
   ;;
@@ -166,27 +190,139 @@ if [ ! -f pkgconfdir/options.user ]; then
   touch pkgconfdir/options.user
 fi
 
+# pick ID1 ID2 ... IDn
+# Echoes an ID matching none of ID1..IDn
+pick() {
+  local n
+  n=250                                # better not choose 0!
+  while :; do
+    ok=true
+    for k in "$@"; do
+      if [ $n = $k ]; then
+        ok=false
+        break
+      fi
+    done
+    if $ok; then
+      echo $n
+      return
+    fi
+    n=$((1+$n))
+  done
+}
+
+case $os in
+Mac )
+  # Apple don't seem to believe in creating a user as a discrete operation
+  if dscl / -read /Groups/$group >/dev/null 2>&1; then
+    echo "$group group already exists"
+  else
+    echo "Creating $group group"
+    gids=$(dscl / -list /Groups PrimaryGroupID|awk '{print $2}')
+    gid=$(pick $gids)
+    echo "(picked gid $gid)"
+    dscl / -create /Groups/$group
+    dscl / -create /Groups/$group PrimaryGroupID $gid
+    dscl / -create /Groups/$group Password \*
+  fi
+  if dscl / -read /Users/$user >/dev/null 2>&1; then
+    echo "$user user already exists"
+  else
+    echo "Creating $user user"
+    uids=$(dscl / -list /Users UniqueID|awk '{print $2}')
+    uid=$(pick $uids)
+    echo "(picked uid $uid)"
+    gid=$(dscl / -read /Groups/$group PrimaryGroupID | awk '{print $2}')
+    dscl / -create /Users/$user
+    dscl / -create /Users/$user UniqueID $uid
+    dscl / -create /Users/$user UserShell /usr/bin/false
+    dscl / -create /Users/$user RealName 'DisOrder server'
+    dscl / -create /Users/$user NFSHomeDirectory pkgstatedir
+    dscl / -create /Users/$user PrimaryGroupID $gid
+    dscl / -create /Users/$user Password \*
+  fi
+  ;;
+FreeBSD )
+  # FreeBSD has a simple well-documented interface
+  if pw groupshow $group >/dev/null 2>&1; then
+    echo "$group group already exists"
+  else
+    echo "Creating $group group"
+    pw groupadd $group
+  fi
+  if pw usershow $user >/dev/null 2>&1; then
+    echo "$user user already exists"
+  else
+    echo "Creating $user user"
+    pw useradd $user -w no -d pkgstatedir -g $group -c 'DisOrder user'
+  fi
+  ;;
+Linux )
+  if grep ^$group: /etc/group >/dev/null; then
+    echo "$group group already exists"
+  else
+    echo "Creating $group group"
+    groupadd $group
+  fi
+  if grep ^$user: /etc/passwd >/dev/null; then
+    echo "$user user already exists"
+  else
+    echo "Creating $user user"
+    useradd -d pkgstatedir -g $group $user -c 'DisOrder user'
+  fi
+  ;;
+esac
+
 echo "Making sure that pkgstatedir exists"
 mkdir -p pkgstatedir
 chown $user:$group pkgstatedir
 chmod 2755 pkgstatedir
 
 case $os in
-mac )
-  echo "Installing the plist into /Library/LaunchDaemons/"
-  cp server/uk.org.greenend.rjk.disorder.plist /Library/LaunchDaemons/.
+Mac )
+  echo "Installing the plist into /Library/LaunchDaemons"
+  cp examples/uk.org.greenend.rjk.disorder.plist /Library/LaunchDaemons/.
   echo "Reloading launchd"
   launchctl load /Library/LaunchDaemons
   echo "Starting DisOrder server"
   launchctl start uk.org.greenend.rjk.disorder
   echo "Installing CGI"
   install -m 555 server/disorder.cgi /Library/WebServer/CGI-Executables/disorder
-  echo "Setting up link to CGI resources"
-  rm /etc/httpd/users/disorder.conf.new
-  echo Alias /disorder/ pkgdatadir/static/ >> /etc/httpd/users/disorder.conf.new
-  mv /etc/httpd/users/disorder.conf.new /etc/httpd/users/disorder.conf
-  echo "Reloading web server"
-  sudo apachectl graceful
+  echo "Setting up link to CGI's dependencies"
+  rm -f /Library/WebServer/Documents/disorder
+  ln -s pkgdatadir/static /Library/WebServer/Documents/disorder
+  echo
+  echo "You must sudo disorder setup-guest [--no-online-registration] next."
+  ;;
+FreeBSD )
+  echo "Installing startup script into /etc/rc.d"
+  install -m 555 examples/disorder.rc /etc/rc.d/disorder
+  echo "Starting DisOrder server"
+  /etc/rc.d/disorder start
+  echo "Identifying web server"
+  set /usr/local/www/*
+  case $# in
+  0 )
+    echo
+    echo "Could not find a web server"
+    exit 1
+    ;;
+  1 )
+    ;;
+  * )
+    echo
+    echo "Yikes!  There seems to be more than one web server here."
+    echo "Guessing that you want $1."
+    echo
+    ;;
+  esac
+  web=$1
+  echo "Found $web"
+  echo "Installing CGI"
+  install -m 555 server/disorder.cgi $web/cgi-bin/disorder
+  echo "Setting up link to CGI's dependencies"
+  rm -f $web/data/disorder
+  ln -s pkgdatadir/static $web/data/disorder
   echo
   echo "You must sudo disorder setup-guest [--no-online-registration] next."
   ;;