#!/usr/bin/env bash
exec </dev/null >>/var/vcap/sys/log/shell.log 2>&1
export PATH=$PATH:/var/vcap/packages/git/bin

if [[ $UID != 0 ]]; then
  echo >&2 "$0: must be run as root!"
  exit 1
fi

log() {
  echo >&2 "[$(date +'%Y%m%d %HH%MM.%SS')] shell/setup[$$]: " $*
}

newuser() {
  user=$1         ; shift
  shell=$1        ; shift
  repo=$1         ; shift
  setup_script=$1 ; shift

  home="/home/${user}"
  [ -z ${shell} ] && shell="/bin/bash"

  log "Setting up user ${user}"
  if ! grep -q "^${user}:" /etc/passwd; then
    log "User ${user} does not exist; adding"
    /usr/sbin/useradd -m -d ${home} -s ${shell} ${user}
  fi

  log "Setting up sudoers access for ${user}"
  if ! grep -q "^${user} " /etc/sudoers; then
    log "Access not found; configuring ${user} with NOPASSWD:ALL access"
    (echo; echo "${user} ALL=(ALL:ALL) NOPASSWD:ALL") >> /etc/sudoers
    chmod 0400 /etc/sudoers
  fi

  if [[ $# -gt 0 ]]; then
    log "Setting up ${user} SSH authorized keys"
    mkdir -p ${home}/.ssh
    chmod 0700 ${home}/.ssh
    touch ${home}/.ssh/authorized_keys
    for key in "$@"; do
      if ! grep -q "^$key$" ${home}/.ssh/authorized_keys; then
        echo "$key" >> ${home}/.ssh/authorized_keys
      fi
    done
  fi
  chown -R ${user} ${home}

  if [[ -n "${repo}" ]]; then
    log "Setting up ${user} environment"
    if [[ ! -d ${home}/env ]]; then
      log "Environment repo ${home}/env not found; cloning from upstream"
      git clone ${repo} ${home}/env

      log "Running install script from inside of ${home}/env, as ${user} with HOME=${home}"
      (cd ${home}/env
       export HOME=${home}
       export USER=${user}
       [ -x ./install ] && ./install || true)

   log "Running setup script ('${setup_script}') from inside of ${home}/env, as ${user} with HOME=${home}"
      (sudo -iu ${user} bash -c "[ -x ${setup_script} ] && ${setup_script} || true" )
    fi
  fi

  chown -R ${user} ${home}
}

set -e

log "Setting hostname to <%= p('shell.hostname') %>"
echo "<%= p('shell.hostname') %>" > /etc/hostname
hostname -b -F /etc/hostname

log "Setting up /etc/hosts"
<% p('shell.hosts').each do |line| %>
if ! grep -q '^<%= line %>$' /etc/hosts; then
  echo "<%= line %>" >> /etc/hosts
fi
<% end %>

<% if p('shell.user.account') != '' %>
# deprecated shell.user.* stuff
newuser "<%= p('shell.user.account') %>" \
        "<%= p('shell.user.shell') %>" \
        "<%= p('shell.env.repo') %>"<% if !p('p.shell.user.ssh_keys', []).empty? %> \<% end %>
       <% p('p.shell.user.ssh_keys', []).each do |k| %> "<%= k %>"<% end %>
<% end %>

<% p('shell.users').each do |user| %>
# shell.users[<%= user['name'] %>
newuser "<%= user['name'] %>" \
        "<%= user['shell'] %>" \
        "<%= user['env'] %>" \
		"<%= user['setup_script'] %>"<% if !(user['ssh_keys'] || []).empty? %> \<% end %>
       <% (user['ssh_keys'] || []).each do |k| %> "<%= k %>"<% end %>
<% end %>

touch /var/vcap/sys/run/shell
log "Done"
