#!/bin/sh
#
# BlackArch Linux Controller Script
#
# Checks environment and does necessary setups, optimizations and clean-ups.


SUCCESS=0
FAILURE=1

VERBOSE='/dev/null'


# clean up environment, pacman and do some optimizations
clean_up()
{
  # sys/pacman clean
  pacman -Rscn $(pacman -Qtdq)
  updatedb
  pkgfile -u
  pacman -Fyy
  pacman-db-upgrade
  yes | pacman -Scc
  sync

  return $SUCCESS
}

# setup qemu-kvm related things
setup_qemu()
{
  return $SUCCESS
}

# setup VMware related things
setup_vmware()
{
  pacman -Syy --needed open-vm-tools > $VERBOSE 2>&1

  systemctl enable vmware-vmblock-fuse > $VERBOSE 2>&1
  systemctl enable vmtoolsd > $VERBOSE 2>&1
  systemctl start vmware-vmblock-fuse > $VERBOSE 2>&1
  systemctl start vmtoolsd > $VERBOSE 2>&1

  return $SUCCESS
}

# setup VirtualBox related things
setup_vbox()
{
  pacman -Syy --needed virtualbox-guest-utils virtualbox-guest-modules-arch > \
    $VERBOSE 2>&1

  systemctl enable vboxservice > $VERBOSE 2>&1
  systemctl start vboxservice > $VERBOSE 2>&1

  return $SUCCESS
}

# are we in a VM? if so, make necessary setups
check_vm_env()
{
  env=$(dmesg |egrep -io 'virtualbox|vmware|qemu' | sort -u)

  if [[ "$env" == *"VirtualBox"* ]]
  then
    setup_vbox
  elif [[ "$env" == "VMware" ]]
  then
    setup_vmware
  elif [[ "$env" == *"QEMU"* ]]
  then
    setup_qemu
  fi

  return $SUCCESS
}

pg_cmd()
{
  su - postgres -c "$*"

  return $SUCCESS
}

db_exists()
{
  if pg_cmd "psql -lqt" | cut -d \| -f 1 | grep -qw $1; then
    return $SUCCESS
  fi

  return $FAILURE
}

user_exists()
{
  if echo "SELECT usename FROM pg_user;" | pg_cmd "psql -qt postgres" |
    grep -qw $1; then
      return $SUCCESS
  fi

  return $FAILURE
}

# setup Metasploit related things
setup_msf_env()
{
  pacman -Syy --needed metasploit postgresql postgresql-libs > $VERBOSE 2>&1

  METASPLOIT_BASEDIR=/opt/metasploit
  PG_BASEDIR=/var/lib/postgres

  DB_CONF=${METASPLOIT_BASEDIR}/config/database.yml
  DB_NAME=msf
  DB_USER=msf
  DB_PASS=$(openssl rand -base64 32)
  DB_PORT=5432
  PG_CONF=${PG_BASEDIR}/data/postgresql.conf

  if [ -e ${PG_CONF} ]; then
    return
  else
    pg_cmd "initdb --locale en_US.UTF-8 -D '$PG_BASEDIR/data'" > $VERBOSE 2>&1
  fi

  systemctl start postgresql > $VERBOSE 2>&1

  systemctl enable postgresql > $VERBOSE 2>&1

  if user_exists ${DB_USER}; then
    printf "ALTER ROLE ${DB_USER} WITH PASSWORD '$DB_PASS';\n" |
      pg_cmd psql postgres > $VERBOSE 2>&1
  else
    TMPFILE=$(mktemp) || (echo -e "${RED}[-]${RESET} Error: Couldn't create temp file" && exit 1)
    printf "%s\n%s\n" "${DB_PASS}" "${DB_PASS}" |
      pg_cmd createuser -S -D -R -P ${DB_USER} > $VERBOSE 2>&1 > "${TMPFILE}"
    grep -v "^Enter password for new role: $\|^Enter it again: $" "${TMPFILE}"
    rm -f "${TMPFILE}"
  fi

  if ! db_exists ${DB_NAME}; then
    pg_cmd createdb ${DB_NAME} -O ${DB_USER} -T template0 -E UTF-8
  fi

  if ! db_exists ${DB_NAME}_test; then
    pg_cmd createdb ${DB_NAME}_test -O ${DB_USER} -T template0 -E UTF-8
  fi

  cat > ${DB_CONF} <<-EOF
development:
  adapter: postgresql
  database: ${DB_NAME}
  username: ${DB_USER}
  password: ${DB_PASS}
  host: localhost
  port: $DB_PORT
  pool: 5
  timeout: 5

production:
  adapter: postgresql
  database: ${DB_NAME}
  username: ${DB_USER}
  password: ${DB_PASS}
  host: localhost
  port: $DB_PORT
  pool: 5
  timeout: 5

test:
  adapter: postgresql
  database: ${DB_NAME}_test
  username: ${DB_USER}
  password: ${DB_PASS}
  host: localhost
  port: $DB_PORT
  pool: 5
  timeout: 5
EOF

  echo "export MSF_DATABASE_CONFIG=$DB_CONF" > /etc/profile.d/metasploit.sh

  return $SUCCESS
}

# controller
main()
{
  check_vm_env
  #setup_msf_env
  clean_up

  return $SUCCESS
}

# we start here
main
