scripts/install_xtuple: ignore error dropping previous DB
[xtuple] / scripts / install_xtuple.sh
1 #!/bin/bash
2
3 set -e
4
5 alias sudo='sudo env PATH=$PATH $@'
6
7 NODE_VERSION=0.8.26
8
9 RUN_DIR=$(pwd)
10 LOG_FILE=$RUN_DIR/install.log
11 cp $LOG_FILE $LOG_FILE.old 2>&1 &> /dev/null || true
12 log() {
13         echo "xtuple >> $@"
14         echo $@ >> $LOG_FILE
15 }
16
17 varlog() {
18   log $(eval "echo $1 = \$$1")
19 }
20
21 cdir() {
22         cd $1
23         log "Changing directory to $1"
24 }
25
26 PG_VERSION=9.1
27 DATABASE=dev
28 RUNALL=true
29 XT_VERSION=
30 BASEDIR=/usr/local/src
31 LIBS_ONLY=
32 XT_DIR=$RUN_DIR
33 XTUPLE_REPO='http://sourceforge.net/projects/postbooks/files/mobile-debian'
34
35 while getopts ":d:ipnhmx-:" opt; do
36   case $opt in
37     d)
38       PG_VERSION=$OPTARG
39       echo $PG_VERSION
40       ;;
41     i)
42       # Install packages
43       RUNALL=
44       INSTALL=true
45       ;;
46     p)
47       # Configure postgress
48       RUNALL=
49       POSTGRES=true
50       ;;
51     n)
52       # iNitialize the databases and stuff
53       RUNALL=
54       INIT=true
55       ;;
56     m)
57       RUNALL=
58       NPM_INSTALL=true
59       ;;
60     x)
61       # Checkout a specific version of the xTuple repo
62       XT_VERSION=$OPTARG
63       ;;
64     init)
65       # only for initializing a fresh debian package install
66       RUNALL=
67       USERINIT=true
68       ;;
69     node)
70       # select the version to use for nodejs
71       NODE_VERSION=$OPTARG
72       varlog NODE_VERSION
73       ;;
74     h)
75       echo "Usage: install_xtuple [OPTION]"
76          echo "Build the full xTuple Mobile Development Environment."
77          echo ""
78          echo "To install everything, run sudo ./scripts/install_xtuple.sh"
79          echo "Everything will go in /usr/local/src/xtuple"
80          echo ""
81          echo -e "  -h\t\t"
82          echo -e "  -i\t\t"
83          echo -e "  -p\t\t"
84          echo -e "  -n\t\t"
85          echo -e "  -m\t\t"
86          echo -e "  -x\t\t"
87    exit 0;
88       ;;
89   esac
90 done
91
92 if [ $RUNALL ]
93 then
94         INSTALL=true
95         POSTGRES=true
96         INIT=true
97 fi
98
99 if [ $USERINIT ]
100 then
101         INSTALL=
102         POSTGRES=
103         INIT=
104 fi
105
106 if [ -z "$NODE_VERSION" ]
107 then
108         varlog NODE_VERSION
109 fi
110
111 install_packages() {
112   log "installing debian packages..."
113   echo 'deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main' | sudo tee /etc/apt/sources.list.d/pgdg.list > /dev/null
114   sudo wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
115   sudo apt-get -qq update 2>&1 | tee -a $LOG_FILE
116   sudo apt-get -q -y install curl build-essential libssl-dev postgresql-9.1 postgresql-server-dev-9.1 postgresql-contrib-9.1 postgresql-9.1-plv8 2>&1 | tee -a $LOG_FILE
117
118   if [ ! -d "/usr/local/nvm" ]; then
119     sudo rm -f /usr/local/bin/nvm
120     sudo mkdir /usr/local/nvm
121     sudo git clone https://github.com/xtuple/nvm.git /usr/local/nvm
122     sudo ln -s /usr/local/nvm/nvm_bin.sh /usr/local/bin/nvm
123     sudo chmod +x /usr/local/bin/nvm
124   fi
125   sudo nvm install $NODE_VERSION
126   sudo nvm use $NODE_VERSION
127   sudo nvm alias default $NODE_VERSION
128   sudo nvm alias xtuple $NODE_VERSION
129
130         # npm no longer supports its self-signed certificates
131         log "telling npm to use known registrars..."
132         npm config set ca ""
133
134   log "installing npm modules..."
135   npm install --unsafe-perm 2>&1 | tee -a $LOG_FILE
136 }
137
138 # Use only if running from a debian package install for the first time
139 user_init() {
140         if [ "$USER" = "root" ]
141         then
142                 echo "Run this as a normal user"
143                 return 1
144         fi
145         echo "WARNING: This will wipe clean the xtuple folder in your home directory."
146         echo "Hit ctrl-c to cancel."
147         read PAUSE
148         read -p "Github username: " USERNAME ERRS
149         rm -rf ~/xtuple
150
151         git clone git://github.com/$USERNAME/xtuple.git
152         git remote add xtuple git://github.com/xtuple/xtuple.git
153 }
154
155 # Configure postgres and initialize postgres databases
156
157 setup_postgres() {
158         sudo mkdir -p $BASEDIR/postgres
159         if [ $? -ne 0 ]
160         then
161                 return 1
162         fi
163
164         PGDIR=/etc/postgresql/9.1/main
165
166   log "copying configs..."
167         sudo cp $PGDIR/postgresql.conf $PGDIR/postgresql.conf.default
168         sudo cat $PGDIR/postgresql.conf.default | sed "s/#listen_addresses = \S*/listen_addresses = \'*\'/" | sed "s/#custom_variable_classes = ''/custom_variable_classes = 'plv8'/" | sudo tee $PGDIR/postgresql.conf > /dev/null
169         sudo chown postgres $PGDIR/postgresql.conf
170
171         sudo cp $PGDIR/pg_hba.conf $PGDIR/pg_hba.conf.default
172         sudo cat $PGDIR/pg_hba.conf.default | sed "s/local\s*all\s*postgres.*/local\tall\tpostgres\ttrust/" | sed "s/local\s*all\s*all.*/local\tall\tall\ttrust/" | sed "s#host\s*all\s*all\s*127\.0\.0\.1.*#host\tall\tall\t127.0.0.1/32\ttrust#" | sudo tee $PGDIR/pg_hba.conf > /dev/null
173         sudo chown postgres $PGDIR/pg_hba.conf
174
175   log "restarting postgres..."
176         sudo service postgresql restart
177
178   log "dropping existing db, if any..."
179         sudo -u postgres dropdb $DATABASE || true
180
181         cdir $BASEDIR/postgres
182
183   log "Setup database"
184     sudo wget -qO init.sql http://sourceforge.net/projects/postbooks/files/03%20PostBooks-databases/4.2.1/init.sql/download
185         sudo -u postgres psql -q -f 'init.sql' 2>&1 | tee -a $LOG_FILE
186 }
187
188 init_everythings() {
189         log "Setting properties of admin user"
190
191         cdir $XT_DIR/node-datasource
192
193         cat sample_config.js | sed "s/testDatabase: \"\"/testDatabase: '$DATABASE'/" > config.js
194         log "Configured node-datasource"
195         log "The database is now set up..."
196
197         mkdir -p $XT_DIR/node-datasource/lib/private
198         cdir $XT_DIR/node-datasource/lib/private
199         cat /dev/urandom | tr -dc '0-9a-zA-Z!@#$%^&*_+-'| head -c 64 > salt.txt
200         log "Created salt"
201         openssl genrsa -des3 -out server.key -passout pass:xtuple 1024 2>&1 | tee -a $LOG_FILE
202         openssl rsa -in server.key -passin pass:xtuple -out key.pem -passout pass:xtuple 2>&1 | tee -a $LOG_FILE
203         openssl req -batch -new -key key.pem -out server.csr -subj '/CN='$(hostname) 2>&1 | tee -a $LOG_FILE
204         openssl x509 -req -days 365 -in server.csr -signkey key.pem -out server.crt 2>&1 | tee -a $LOG_FILE
205         if [ $? -ne 0 ]
206         then
207                 log "Failed to generate server certificate in $XT_DIR/node-datasource/lib/private"
208                 return 3
209         fi
210
211         cdir $XT_DIR/test/lib
212   cat sample_login_data.js | sed "s/org: \'dev\'/org: \'$DATABASE\'/" > login_data.js
213         log "Created testing login_data.js"
214
215         cdir $XT_DIR
216         npm run-script test-build 2>&1 | tee -a $LOG_FILE
217
218         log "You can login to the database and mobile client with:"
219         log "  username: admin"
220         log "  password: admin"
221         log "Installation now finished."
222         log "Run the following commands to start the datasource:"
223         if [ $USERNAME ]
224         then
225                 log "cd node-datasource"
226                 log "node main.js"
227         else
228                 log "cd /usr/local/src/xtuple/node-datasource/"
229                 log "node main.js"
230         fi
231 }
232
233 if [ $USERINIT ]
234 then
235         user_init
236 fi
237
238 if [ $INSTALL ]
239 then
240   log "install_packages()"
241         install_packages
242         if [ $? -ne 0 ]
243         then
244                 log "package installation failed."
245                 exit 1
246         fi
247 fi
248
249 if [ $POSTGRES ]
250 then
251   log "setup_postgres()"
252         setup_postgres
253         if [ $? -ne 0 ]
254         then
255                 exit 4
256         fi
257 fi
258 if [ $INIT ]
259 then
260   log "init_everythings()"
261         init_everythings
262         if [ $? -ne 0 ]
263         then
264                 log "init_everythings failed"
265         fi
266 fi
267
268 log "All Done!"