#!/bin/sh -e

# === FIRST DRAFT ===

#
# this script creates the root (CA) certificate and
# server cert for PostgreSQL.  The OpenSSL applications
# must be in the path.
#

if [ $PG_HOME"." = "." ]
then
  /bin/echo You must define \$PG_HOME before running this program.
  exit 0
fi

#
# generate DSA parameters file used for keys, if one does
# not already exist.
#
if [ ! -f $PG_HOME/dsa1024.pem -o -z $PG_HOME/dsa1024.pem ]
then
  openssl dsaparam -out $PG_HOME/dsa1024.pem 1024
fi

#
# generate CA directory tree and contents, if it does not already
# exist.
#
if [ ! -d $PG_HOME/CA ]
then
  /bin/mkdir $PG_HOME/CA;
fi
if [ ! -d $PG_HOME/CA/certs ]
then
  /bin/mkdir $PG_HOME/CA/certs
fi
if [ ! -d $PG_HOME/CA/crl ]
then
  /bin/mkdir $PG_HOME/CA/crl
fi
if [ ! -d $PG_HOME/CA/newcerts ]
then
  /bin/mkdir $PG_HOME/CA/newcerts
fi
if [ ! -d $PG_HOME/CA/private ]
then
  /bin/mkdir $PG_HOME/CA/private
  /bin/chmod 0700 $PG_HOME/CA/private
fi
if [ ! -f $PG_HOME/CA/index.txt ]
then
  /usr/bin/touch $PG_HOME/CA/index.txt
fi
if [ ! -f $PG_HOME/CA/serial ]
then
  /bin/echo 01 > $PG_HOME/CA/serial
fi

#
# generate root key, if one does not already exist.
#
if [ ! -f $PG_HOME/CA/private/cakey.pem -o -z $PG_HOME/CA/private/cakey.pem ]
then
  openssl gendsa -out $PG_HOME/CA/private/cakey.pem $PG_HOME/dsa1024.pem
  /bin/chmod 0700 $PG_HOME/CA/private/cakey.pem
fi

#
# generate self-signed root certificate, if one does not already exist
#
if [ ! -f $PG_HOME/CA/cacert.pem -o -z $PG_HOME/CA/cacert.pem ]
then
  /bin/echo "Creating the CA root certificate...."
  /bin/echo "The common name should be something like 'PostgreSQL Root Cert'"
  /bin/echo ""
  openssl req -new -x509 -out $PG_HOME/CA/cacert.pem \
	-key $PG_HOME/CA/private/cakey.pem \
	-config $PG_HOME/openssl.conf
  /bin/link -s 
fi

#
# generate server key, if one does not already exist.
#
if [ ! -f $PG_HOME/server.key -o -z $PG_HOME/server.key ]
then
  openssl gendsa -out $PG_HOME/server.key $PG_HOME/dsa1024.pem
  /bin/chmod 0700 $PG_HOME/CA/private/cakey.pem
fi

#
# generate server certificate, if one does not already exist.
#
if [ ! -f $PG_HOME/server.crt -o -z $PG_HOME/server.crt ]
then
  /bin/echo "Creating the PostgreSQL server certificate...."
  /bin/echo "The common name must be the fully qualified domain name of server!"
  /bin/echo ""
  openssl req -new -x509 -out $PG_HOME/server.self \
	-key $PG_HOME/server.key \
	-config $PG_HOME/openssl.conf
  if [ -f $PG_HOME/server.self ]
  then
    openssl ca -out $PG_HOME/server.crt -config $PG_HOME/openssl.conf \
	-ss_cert $PG_HOME/server.self
    /bin/rm -f $PG_HOME/server.self
  fi
fi
