[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC] prepare-database script



Here is a bit of a patch you might like.


*** ./prepare-company-database.sh	2011-06-02 18:10:15.000000000 -0400
--- ./prepare-company-database.sh.patched	2011-06-02 18:19:06.000000000 -0400
***************
*** 44,52 ****
  First name:  $ADMIN_FIRSTNAME  (NULL == none)
  Middle name: $ADMIN_MIDDLENAME (NULL == none)
  Last name:   $ADMIN_LASTNAME   (NULL == none)
! Country:     'US'

! This default user will be assigned all priviledges within the application.

  Available options:
   --srcdir	The path where the sources for LedgerSMB are located
--- 44,52 ----
  First name:  $ADMIN_FIRSTNAME  (NULL == none)
  Middle name: $ADMIN_MIDDLENAME (NULL == none)
  Last name:   $ADMIN_LASTNAME   (NULL == none)
! Country:     US

! This default user will be assigned all privileges within the application.

  Available options:
   --srcdir	The path where the sources for LedgerSMB are located
***************
*** 56,62 ****
   --host		The PostgreSQL host to connect to (see 'man psql') [$host]
   --port		The PostgreSQL port to connect to (see 'man psql') [$port]
   --pgsql-contrib The directory where the tsearch2.sql, pg_trgm.sql and
!                 tablefunc.sql PostgeSQL are located [$pgslq_contrib_dir]
   --company	The name of the database to be created for the company [*]
   --owner	The name of the superuser which is to become owner of the
  		company's database [$owner]
--- 56,62 ----
   --host		The PostgreSQL host to connect to (see 'man psql') [$host]
   --port		The PostgreSQL port to connect to (see 'man psql') [$port]
   --pgsql-contrib The directory where the tsearch2.sql, pg_trgm.sql and
!                 tablefunc.sql PostgreSQL are located [$pgsql_contrib_dir]
   --company	The name of the database to be created for the company [*]
   --owner	The name of the superuser which is to become owner of the
  		company's database [$owner]


Luke

On Thu, 2 Jun 2011, Erik Huelsmann wrote:

The attached patch is a slightly improved version because the other
one overwrote my ledgersmb.conf file today (serveral times :-)

Bye,


Erik.

On Thu, Jun 2, 2011 at 6:04 PM, Erik Huelsmann <..hidden..> wrote:
There was discussion on having easier setup procedures. Even though
the attached script doesn't install the required Perl modules and
PostgreSQL contrib files, it does contain everything required to
quickly generate a company database, without the complicated manual
instructions you currently have to go through.

It works on my Debian Squeeze system which has all the required
modules installed.


The script is still shell, but really should be able to run on most
systems. I know there's been discussion on requiring it to be Perl.
That's a task I'd rather leave to others. This one works and only
needs a simple translation step to be applied. Possibly, the testing
framework which is able to set up company databases too can be
copy/pasted for the task of table/trigger setup.


The script is by no means meant to be the final solution, but should
relieve short term pain and serve as documentation for anybody trying
to set up LSMB manually.


Bye,

Erik.


#!/bin/sh

# Script to explain the steps to take when installing LedgerSMB

# Default variable values section

owner=ledgersmb
pass=LEDGERSMBINITIAL
host=localhost
port=5432
srcdir=$PWD
dstdir=$PWD
coa=us/General.sql
gifi=
pgsql_contrib_dir=ignore
ADMIN_FIRSTNAME='Default'
ADMIN_MIDDLENAME=NULL
ADMIN_LASTNAME='Admin'
ADMIN_USERNAME='admin'
ADMIN_PASSWORD='admin'


# Usage explanation section


usage () {
script_name=`basename $0`
cat <<USAGE
usage: $script_name [option1 .. optionN]

This script wants to be run as the root user. If you don't, you'll be
asked to enter the password of the 'postres' user

This script creates a 'ledgersmb' user on the specified PostgreSQL host,
if it does not exist.  Then it proceeds to load the LedgerSMB database
structure and content, loading Chart of Accounts data and GIFI data
as specified in the argument list.

After the database has been created, the script inserts a default user
'$ADMIN_USER' (password: '$ADMIN_PASSWORD'), with these initial values:

First name:  $ADMIN_FIRSTNAME  (NULL == none)
Middle name: $ADMIN_MIDDLENAME (NULL == none)
Last name:   $ADMIN_LASTNAME   (NULL == none)
Country:     'US'

This default user will be assigned all priviledges within the application.

Available options:
 --srcdir       The path where the sources for LedgerSMB are located
               [$srcdir]
 --dstdir       The path where the sources will be located when invoked
               from the webserver [$dstdir]
 --host         The PostgreSQL host to connect to (see 'man psql') [$host]
 --port         The PostgreSQL port to connect to (see 'man psql') [$port]
 --pgsql-contrib The directory where the tsearch2.sql, pg_trgm.sql and
               tablefunc.sql PostgeSQL are located [$pgslq_contrib_dir]
 --company      The name of the database to be created for the company [*]
 --owner        The name of the superuser which is to become owner of the
               company's database [$owner]
 --password     The password to be used to create the 'ledgersmb' user
               on the specified PostgreSQL server [$pass]
 --coa          The path locating the file to be
               used to load the Chart of Accounts data
 --gifi         The path locating the file to be
               used to load the GIFI data with the chart of accounts
 --progress     Echoes the commands executed by the script during setup
 --help         Shows this help screen

 * These arguments don't have a default, but are required
USAGE

}

# Extract options and setup variables
if ! options=$( getopt -u -l
company:,coa:,gifi:,srcdir:,dstdir:,password:,host:,port:,help,progress,pgsql-contrib:
'' "$@" )
then
 exit 1
fi

set -- $options
while test $# -gt 0 ;
do

 shift_args=2
 case "$1" in
   --)
       shift_args=1
       ;;
   --company)
       company_name=$2
#       break
       ;;
   --coa)
       coa=$2
#       break
       ;;
   --gifi)
       gifi=$2
#       break
       ;;
   --srcdir)
       srcdir=$2
#       break
       ;;
   --dstdir)
       dstdir=$2
#       break
       ;;
   --password)
       pass=$2
#       break
       ;;
   --host)
       host=$2
#       break
       ;;
   --port)
       port=$2
#       break
       ;;
   --pgsql-contrib)
       pgsql_contrib_dir=$2
#       break
       ;;
   --progress)
       progress=yes
       shift_args=1
#       break
       ;;
   --help)
       usage
       exit 0;;
 esac
 shift $shift_args
done

if test -z "$company_name"
then
 echo "missing or empty --company option"
 usage
 exit 1
fi

if test "$pgsql_contrib_dir" = "ignore"
then
 echo "missing argument --pgsql-contrib!"
 usage
 exit 1
fi

psql_args="-h $host -p $port -U $owner"
psql_cmd="psql $psql_args -d $company_name"


if test -n "$progress"
then
 # Use shell command-echoing to "report progress"
 set -x
fi

sed -e "s|WORKING_DIR|$dstdir|g" \
  $srcdir/ledgersmb-httpd.conf >$dstdir/ledgersmb.conf
cat <<EOF | su -c "psql -U postgres -d postgres "  postgres
CREATE ROLE $owner WITH SUPERUSER LOGIN NOINHERIT ENCRYPTED PASSWORD '$pass';
CREATE DATABASE $company_name WITH ENCODING = 'UNICODE' OWNER = $owner
TEMPLATE = template0;
\\c $company_name
CREATE LANGUAGE plpgsql;
EOF

PGPASSWORD=$pass
export PGPASSWORD


#createdb $psql_args -O $owner -E UNICODE $company_name
#createlang $psql_args plpgsql $company_name


# Load the required PostgreSQL contribs, if a directory was specified
if ! test "x$pgsql_contrib_dir" = "xignored"
then
 for contrib in tsearch2.sql pg_trgm.sql tablefunc.sql
 do
   cat $pgsql_contrib_dir/$contrib | $psql_cmd
 done
fi

# Load the base file(s)
# -- Basic database structure
cat $srcdir/sql/Pg-database.sql | $psql_cmd
# -- Additional database structure
for module in `grep -v -E '^[[:space:]]*#' sql/modules/LOADORDER`
do
 cat $srcdir/sql/modules/$module | $psql_cmd
done
# -- Authorizations
sed -e "s/<?lsmb dbname ?>/$company_name/g" \
 $srcdir/sql/modules/Roles.sql | $psql_cmd


if test -n "$coa" ; then
 # Load a chart of accounts
 cat $coa | $psql_cmd
 if test -n "$gifi" ; then
   cat $gifi | $psql_cmd
 fi
fi

cat <<CREATE_USER | $psql_cmd
EXECUTE admin__save_user(NULL,
                        person__save(NULL,
                                     3,
                                     '$ADMIN_FIRSTNAME',
                                     '$ADMIN_MIDDLENAME',
                                     '$ADMIN_LASTNAME',
                                     (SELECT id FROM country
                                      WHERE short_name = 'US')),
                        '$ADMIN_USERNAME',
                        '$ADMIN_PASSWORD');

SELECT admin__add_user_to_role('$ADMIN_USERNAME', rolname)
FROM pg_roles
WHERE rolname like 'lsmb_${company_name}_%';

CREATE_USER