Enable custom-built packages (user/group/location)

Automatically replace the USER, GROUP, GERRIT_SITE, VERSION
during the packaging phase and on configuration files in
order to create a fully automated custom-built package.

Example: your company requires Gerrit 2.9.3 to be installed on
/opt/gerrit under the user 'review' and group 'wheel'.

$ make USER=review GROUP=wheel GERRIT_SITE=/opt/gerrit VERSION=2.9.3

Generates a package (rpm/deb) named:
out/gerrit-2.9.3-1.noarch.(rpm|deb)

Once installed, the gerrit package info is:

Name        : gerrit
Arch        : x86_64
Version     : 2.9.3
Release     : 1
Size        : 39 M
Repo        : installed
Summary     : Gerrit Code Review
URL         : https://code.google.com/p/gerrit/
Licence     : Apache 2.0
Description : Gerrit Code Review

Change-Id: Ib64688fac867ff9bb069d6f7e5ab637c81b7e4e4
diff --git a/fpm/Makefile b/fpm/Makefile
index d2026e5..51666fb 100644
--- a/fpm/Makefile
+++ b/fpm/Makefile
@@ -6,9 +6,9 @@
 CATEGORY=Development
 SUMMARY=Gerrit Code Review
 BUILD_ARCH=noarch
-BUILD_ROOT=build
+BUILD_ROOT=build/root
+SCRIPTS_ROOT=build/scripts
 OUT=out
-ETC=etc
 USER=gerrit
 GROUP=gerrit
 GERRIT_SITE=/var/gerrit
@@ -20,48 +20,61 @@
 
 RPM_OUT=$(OUT)/gerrit-$(VERSION)-$(RELEASE).$(BUILD_ARCH).rpm
 DEB_OUT=$(OUT)/gerrit-$(VERSION)-$(RELEASE).$(BUILD_ARCH).deb
-CONFIGS=$(wildcard $(ETC)/*)
+CONFIGS=$(wildcard etc/*) etc/gerritcodereview
+SCRIPTS=$(foreach script,$(wildcard scripts/*),$(notdir $(script)))
+BUILD_SCRIPTS=$(foreach script,$(SCRIPTS),$(SCRIPTS_ROOT)/$(script))
 
 FPM_OPTS=-s dir \
-	-n $(NAME) -v $(VERSION) --iteration $(RELEASE) --category $(CATEGORY) \
+	-f -n $(NAME) -v $(VERSION) --iteration $(RELEASE) --category $(CATEGORY) \
 	--description "$(SUMMARY)" --url $(WEB_URL) --license "$(LICENSE)" \
 	--depends git \
 	--PKG-user $(USER) --PKG-group $(GROUP) \
-	--before-install scripts/before-install.sh \
-	--after-install scripts/after-install.sh \
-	--before-remove scripts/before-remove.sh \
-	--after-remove scripts/after-remove.sh \
+	--before-install $(SCRIPTS_ROOT)/before-install.sh \
+	--after-install $(SCRIPTS_ROOT)/after-install.sh \
+	--before-remove $(SCRIPTS_ROOT)/before-remove.sh \
+	--after-remove $(SCRIPTS_ROOT)/after-remove.sh \
 	--prefix $(GERRIT_SITE) --directories $(GERRIT_SITE) --config-files $(GERRIT_SITE)/etc \
 	--verbose -C $(BUILD_ROOT) .
 
-RPM_OPTS=$(subst PKG,rpm,$(FPM_OPTS))
+RPM_OPTS=$(subst --before-install,--rpm-pretrans, $(subst PKG,rpm,$(FPM_OPTS)))
 DEB_OPTS=$(subst PKG,deb,$(FPM_OPTS))
 
 all: prepare $(RPM_OUT) $(DEB_OUT)
 
 clean:
 	rm -Rf $(OUT)
-	-grep -q gerrit /etc/passwd && userdel gerrit
 
-prepare:
-	-grep -v -q gerrit /etc/passwd && useradd gerrit
+prepare: $(CONFIGS)
 	mkdir -p $(OUT)
-	mkdir -p $(BUILD_ROOT)/etc/.
-	cp $(CONFIGS) $(BUILD_ROOT)/etc/.
+	mkdir -p $(SCRIPTS_ROOT)
+	mkdir -p $(BUILD_ROOT)/etc
+	mkdir -p $(BUILD_ROOT)/bin
+	cp $(CONFIGS) $(BUILD_ROOT)/etc
+	-groupadd $(GROUP)
+	-useradd $(USER)
 
 clobber: clean
 	rm -Rf $(BUILD_ROOT)
+	rm -Rf $(SCRIPTS_ROOT)
+	rm -Rf etc/gerritcodereview
 
-$(WAR):
-	curl --create-dirs -o $@  $(URL)
+$(WAR): $(basedir $(WAR))
+	curl -o $@  $(URL)
 
-chown:
-	chown -R $(USER): $(BUILD_ROOT)
+$(SCRIPTS_ROOT)/%.sh: scripts/%.sh
+	echo "#!/bin/bash" > $@
+	echo "USER=$(USER)" >> $@
+	echo "GROUP=$(GROUP)" >> $@
+	echo "GERRIT_SITE=$(GERRIT_SITE)" >> $@
+	cat $< >> $@
 
-$(RPM_OUT): $(WAR) $(CONFIGS) chown
+etc/gerritcodereview: 
+	echo "GERRIT_SITE=$(GERRIT_SITE)" > $@
+
+$(RPM_OUT): $(WAR) $(CONFIGS) $(BUILD_SCRIPTS) chown
 	fpm -t rpm -p $@ $(RPM_OPTS)
 
-$(DEB_OUT): $(WAR) $(CONFIGS) chown
+$(DEB_OUT): $(WAR) $(CONFIGS) $(BUILD_SCRIPTS) chown
 	fpm -t deb -p $@ $(DEB_OPTS)
 
 .PHONY: clean clobber prepare chown
diff --git a/fpm/etc/gerritcodereview b/fpm/etc/gerritcodereview
deleted file mode 100644
index 0d7d8cb..0000000
--- a/fpm/etc/gerritcodereview
+++ /dev/null
@@ -1 +0,0 @@
-GERRIT_SITE=/var/gerrit
diff --git a/fpm/scripts/after-install.sh b/fpm/scripts/after-install.sh
index 8670d86..641fe45 100755
--- a/fpm/scripts/after-install.sh
+++ b/fpm/scripts/after-install.sh
@@ -1,9 +1,30 @@
-GERRIT_SITE=/var/gerrit
-SUDO="sudo -u gerrit"
-$SUDO java -jar /var/gerrit/bin/gerrit.war init --batch -d $GERRIT_SITE
-$SUDO java -jar /var/gerrit/bin/gerrit.war reindex -d $GERRIT_SITE
+SUDO="sudo -u $USER"
+LOG=/tmp/gerrit-installer.log
+
+echo ""
+echo -n "Initialising Gerrit site ... "
+$SUDO java -jar $GERRIT_SITE/bin/gerrit.war init --batch -d $GERRIT_SITE >>$LOG 2>>$LOG
+[ $? != 0 ] && echo "FAILED" && exit 1
+echo "DONE"
+
+echo -n "Reindexing Gerrit ... "
+$SUDO java -jar $GERRIT_SITE/bin/gerrit.war reindex -d $GERRIT_SITE >> $LOG 2>>$LOG
+[ $? != 0 ] && echo "FAILED" && exit 2
+echo "DONE"
+
+echo -n "Setting user/group ownership ..."
+chown -R $USER:$GROUP $GERRIT_SITE
+
+echo -n "Creating symlinks ... "
 cd /etc/init.d && ln -sf $GERRIT_SITE/bin/gerrit.sh gerrit
 cd /var/log && ln -sf $GERRIT_SITE/logs gerrit
 cd /etc && ln -sf $GERRIT_SITE/etc gerrit
 [ ! -d /etc/default ] && mkdir -p /etc/default
 cd /etc/default && ln -sf /etc/gerrit/gerritcodereview
+echo "DONE"
+
+echo ""
+echo "Installation completed"
+echo ""
+echo "To start Gerrit server, run: /etc/init.d/gerrit start"
+echo "To start using Gerrit, open: http://$(hostname):8080/"
diff --git a/fpm/scripts/after-remove.sh b/fpm/scripts/after-remove.sh
index e63a8cb..cabc943 100755
--- a/fpm/scripts/after-remove.sh
+++ b/fpm/scripts/after-remove.sh
@@ -1,6 +1,5 @@
-GERRIT_SITE=/var/gerrit
 rm -f /etc/init.d/gerrit || true
 rm -f /var/log/gerrit || true
 rm -f /etc/gerrit || true
 rm /etc/default/gerritcodereview || true
-userdel gerrit || true
+userdel $USER || true
diff --git a/fpm/scripts/before-install.sh b/fpm/scripts/before-install.sh
index 8c301e0..c268428 100755
--- a/fpm/scripts/before-install.sh
+++ b/fpm/scripts/before-install.sh
@@ -1,11 +1,31 @@
-GERRIT_SITE=/var/gerrit
-grep -q gerrit /etc/passwd || echo -n "Creating Gerrit user ... " && useradd gerrit -d $GERRIT_SITE --create-home && echo "DONE"
+LOG=/tmp/gerrit-installer.log
+
+GROUP_ID=$(/usr/bin/getent group $GROUP | cut -d ':' -f 3 2>> $LOG || true)
+if [ "$GROUP_ID" == "" ]
+then
+  echo -n "Creating $GROUP group ... " 
+  groupadd $GROUP >> $LOG 2>> $LOG
+  [ $? != 0 ] && echo "FAILED" && exit 1
+  GROUP_ID=$(/usr/bin/getent group $GROUP | cut -d ':' -f 3 2>> $LOG || true)
+  echo "DONE"
+fi
+
+USER_PASSWD=$(/usr/bin/getent passwd $USER 2>> $LOG || true)
+if [ "$USER_PASSWD" == "" ]
+then
+  echo -n "Creating $USER user ... " 
+  useradd $USER -M -g $GROUP_ID -d $GERRIT_SITE >> $LOG 2>> $LOG
+  [ $? != 0 ] && echo "FAILED" && exit 1
+  echo "DONE"
+fi
+
 
 echo -n "Checking Java version ... "
 JAVA_VERSION=$(java -version 2>&1)
-[ $? != 0 ] && echo -e "NOT FOUND\nPlease install Java >= 1.7.0 and try again" && exit 1
+[ $? != 0 ] && echo -e "NOT FOUND\nPlease install Java >= 1.7.0 and try again" && exit 2
 
 VERSION=`expr "$JAVA_VERSION" : '.*"\(1.[0-9\.]*\)["_]'`
 echo "$VERSION"
-test "$VERSION" "<" "1.7" && echo "ERROR: java >= 1.7.0 required by Gerrit" || true
-test "$VERSION" ">" "1.7"
+test "$VERSION" "<" "1.7" && echo "ERROR: java >= 1.7.0 required by Gerrit" && exit 3
+exit 0
+
diff --git a/fpm/scripts/before-remove.sh b/fpm/scripts/before-remove.sh
index ffa3ccb..5d22cd5 100644
--- a/fpm/scripts/before-remove.sh
+++ b/fpm/scripts/before-remove.sh
@@ -1 +1 @@
-/var/gerrit/bin/gerrit.sh stop
+$GERRIT_SITE/bin/gerrit.sh stop || true