From 4dbab660e4326edf1d095722c7d58765b9cc2a69 Mon Sep 17 00:00:00 2001
From: Ethan Buchman <ethan@coinculture.info>
Date: Fri, 3 Jul 2015 20:30:52 +0000
Subject: [PATCH] add chain manager scripts to erisdb

---
 DOCKER/Dockerfile     |  8 +++--
 DOCKER/build.sh       | 10 +++---
 DOCKER/chain_fetch.sh | 56 ++++++++++++++++++++++++++++++++++
 DOCKER/chain_new.sh   | 14 +++++++++
 DOCKER/chain_run.sh   | 26 ++++++++++++++++
 DOCKER/config.toml    | 10 ++++++
 DOCKER/start.sh       | 71 ++++++++++++++++++++++++++++++++++++++++---
 7 files changed, 184 insertions(+), 11 deletions(-)
 create mode 100755 DOCKER/chain_fetch.sh
 create mode 100755 DOCKER/chain_new.sh
 create mode 100755 DOCKER/chain_run.sh
 create mode 100644 DOCKER/config.toml

diff --git a/DOCKER/Dockerfile b/DOCKER/Dockerfile
index 74345aec..f354a301 100644
--- a/DOCKER/Dockerfile
+++ b/DOCKER/Dockerfile
@@ -25,7 +25,7 @@ RUN mkdir --parents $GOPATH/src/$REPO
 WORKDIR $GOPATH/src/$REPO
 RUN git clone https://$REPO . && \
   git checkout $BRANCH && \
-  go build -o ./build/tendermint ./cmd/tendermint
+  go build -o ./build/tendermint ./cmd/tendermint && \
   mv ./build/tendermint /usr/local/bin/tendermint
 
 # set the repo and install erisdb
@@ -39,6 +39,10 @@ RUN cd ./cmd/erisdb && \
   go build && \
   mv erisdbss /usr/local/bin/
 
+# install chain manager scripts
+COPY ./DOCKER/chain_* /usr/local/bin/
+ENV ECM_PATH /usr/local/bin
+
 # set the repo and install mint-client
 ENV REPO github.com/eris-ltd/mint-client
 ENV BRANCH master
@@ -61,4 +65,4 @@ RUN mkdir --parents /home/$USER/.eris/blockchains/tendermint
 ENV TMROOT /home/$USER/.eris/blockchains/tendermint
 
 # run tendermint
-CMD ["erisdb-wrapper"]
+ENTRYPOINT ["erisdb-wrapper"]
diff --git a/DOCKER/build.sh b/DOCKER/build.sh
index 0ed34a66..aa51ef77 100755
--- a/DOCKER/build.sh
+++ b/DOCKER/build.sh
@@ -1,13 +1,15 @@
 #!/bin/bash
 base=github.com/eris-ltd/eris-db
 repo=$GOPATH/src/$base
-branch=${ERISDB_BUILD_BRANCH:=docker}
+branch=${ERISDB_BUILD_BRANCH:=dockerfixes}
 start=`pwd`
 
 cd $repo
-git checkout $branch
-git pull origin
+if [ "$DEV" != "true" ]; then 
+	git checkout $branch
+	git pull origin
+fi
 
 docker build -t eris/erisdb:0.10 -f DOCKER/Dockerfile .
 
-cd $start
\ No newline at end of file
+cd $start
diff --git a/DOCKER/chain_fetch.sh b/DOCKER/chain_fetch.sh
new file mode 100755
index 00000000..36a685aa
--- /dev/null
+++ b/DOCKER/chain_fetch.sh
@@ -0,0 +1,56 @@
+#! /bin/sh
+
+ifExit(){
+	if [ $? -ne 0 ]; then
+		echo $1
+		exit 1
+	fi
+}
+
+# fetching a chain means grabbing its genesis.json (from etcb) and putting it in the right folder
+# we also copy in the config.toml, and update grab the seed node from etcb
+
+## get chain id for main reference chain (given by NODE_ADDR)
+REFS_CHAIN_ID=$(mintinfo --node-addr $NODE_ADDR genesis chain_id)
+ifExit "Error fetching default chain id from $NODE_ADDR"
+REFS_CHAIN_ID=$(echo "$REFS_CHAIN_ID" | tr -d '"') # remove surrounding quotes
+
+# get the genesis.json for a refs chain from the /genesis rpc endpoint
+# for a different chain, use etcb (ie namereg on the ref chain)
+if [ "$CHAIN_ID" = "$REF_CHAIN_ID"    ] ; then
+	# grab genesis.json and config
+	mintinfo --node-addr $NODE_ADDR genesis > "${CHAIN_DIR}/genesis.json"
+	ifExit "Error fetching genesis.json from $NODE_ADDR"
+	cp $ECM_PATH/config.toml "${CHAIN_DIR}/config.toml"
+	ifExit "Error copying config file from $ECM_PATH to $CHAIN_DIR"
+else 
+	# fetch genesis from etcb
+	GENESIS=$(mintinfo --node-addr $NODE_ADDR names "${CHAIN_ID}_genesis.json" data)
+	ifExit "Error fetching genesis.json for $CHAIN_ID: $GENESIS"
+
+	echo $GENESIS > "${CHAIN_DIR}/genesis.json"
+	cp $ECM_PATH/config.toml "${CHAIN_DIR}/config.toml"
+	ifExit "Error copying config file from $ECM_PATH to $CHAIN_DIR"
+
+	SEED_NODE=$(mintinfo --node-addr $NODE_ADDR names "${CHAIN_ID}_seed" data)
+	ifExit "Error grabbing seed node from $NODE_ADDR for $CHAIN_ID"
+
+	sed -i "s/^\(seeds\s*=\s*\).*\$/\1\"$SEED_NODE\"/" "${CHAIN_DIR}/config.toml"
+	ifExit "Error setting seed node in config.toml"
+	echo "Seed node: ${SEED_NODE}"
+fi
+
+if [ "$HOST_NAME" = "" ]; then
+	HOST_NAME=mint_user
+fi
+
+echo "Host name: ${HOST_NAME}"
+
+sed -i "s/^\(moniker\s*=\s*\).*\$/\1\"$HOST_NAME\"/" "${CHAIN_DIR}/config.toml"
+ifExit "Error setting host name in config.toml"
+
+
+# would be nice if we could stop syncing once we're caught up ...
+echo "Running mint in ${CHAIN_DIR}"
+tendermint node --fast_sync 
+ifExit "Error running tendermint!"
diff --git a/DOCKER/chain_new.sh b/DOCKER/chain_new.sh
new file mode 100755
index 00000000..6babaf97
--- /dev/null
+++ b/DOCKER/chain_new.sh
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+echo "new chain: $CHAIN_ID"
+
+if [ "$GENERATE_GENESIS" = "true" ]; then
+	mintgen --single $CHAIN_DIR
+fi
+
+if [ "$RUN" = "true" ]; then
+	tendermint node	
+else
+	# this will just run for a second and quit
+	tendermint node & last_pid=$! && sleep 1 && kill -KILL $last_pid
+fi
diff --git a/DOCKER/chain_run.sh b/DOCKER/chain_run.sh
new file mode 100755
index 00000000..dc50082b
--- /dev/null
+++ b/DOCKER/chain_run.sh
@@ -0,0 +1,26 @@
+#! /bin/bash
+
+ifExit(){
+	if [ $? -ne 0 ]; then
+		echo $1
+		exit 1
+	fi
+}
+
+# if no CHAIN_ID, get that off the main test net
+if [[ ! $CHAIN_ID ]]; then
+	# get the chain id 
+	CHAIN_ID=$(mintinfo --node-addr $NODE_ADDR genesis chain_id)
+	ifExit "Error fetching default chain id from $NODE_ADDR"
+	CHAIN_ID=$(echo "$CHAIN_ID" | tr -d '"') # remove surrounding quotes
+fi
+
+CHAIN_DIR="${ROOT_DIR}/$CHAIN_ID"
+
+if [[ ! -d  $CHAIN_DIR ]]; then
+	echo "Unknown chain ($CHAIN_ID)"
+	exit 1
+fi
+
+echo Running chain $CHAIN_ID
+tendermint node
diff --git a/DOCKER/config.toml b/DOCKER/config.toml
new file mode 100644
index 00000000..6959fd29
--- /dev/null
+++ b/DOCKER/config.toml
@@ -0,0 +1,10 @@
+# This is a TOML config file.
+# For more information, see https://github.com/toml-lang/toml
+
+moniker = "eris_db"
+node_laddr = "0.0.0.0:46656"
+seeds = "interblock.io:46656"
+fast_sync = true
+db_backend = "leveldb"
+log_level = "debug"
+rpc_laddr = "0.0.0.0:46657"
diff --git a/DOCKER/start.sh b/DOCKER/start.sh
index eb3457cd..6b52a87a 100755
--- a/DOCKER/start.sh
+++ b/DOCKER/start.sh
@@ -1,7 +1,68 @@
-#!/bin/bash
-if [[ $FAST_SYNC ]]; then
-  tendermint node --fast_sync
-else
-  tendermint node
+#! /bin/sh
+
+ifExit(){
+	if [ $? -ne 0 ]; then
+		echo $1
+		exit 1
+	fi
+}
+
+#############################################
+# We expect the following env vars to be set
+# $CHAIN_ID
+#
+# one day we'll make it more flexible
+# for now the only consumer is eris-cli
+
+
+# TODO: deal with chain numbers
+# and eg. $CONTAINER_NAME 
+CHAIN_DIR="/home/$USER/.eris/blockchains/$CHAIN_ID"
+
+TMROOT=$CHAIN_DIR
+
+if [ ! -d "$CHAIN_DIR" ]; then
+	mkdir -p $CHAIN_DIR
+	ifExit "Error making root dir $CHAIN_DIR"
+fi
+
+# our root chain
+if [ ! $NODE_ADDR ]; then
+	NODE_ADDR=http://interblock.io:46657
 fi
 
+# where the etcb client scripts are
+if [ ! $ECM_PATH ]; then
+	ECM_PATH=.
+fi
+
+
+export TMROOT
+export CHAIN_DIR
+export NODE_ADDR
+export ECM_PATH  # set by Dockerfile
+
+
+# either we are fetching a chain for the first time,
+# creating one from scratch, or running one we already have
+CMD=$1
+case $CMD in
+"fetch" ) $ECM_PATH/chain_fetch.sh
+	;;
+"new" ) $ECM_PATH/chain_new.sh
+	;;
+"run" ) $ECM_PATH/chain_run.sh
+	;;
+*)	echo "Enter a command for starting the chain (fetch, new, run)"
+	;;
+esac
+
+#--------------------------------------------------------------------------------
+
+# XXX: assume for now the chain_id is always given
+#
+## if no CHAIN_ID given, use the ref chain
+#if [ ! $CHAIN_ID ]; then
+#	CHAIN_ID=$REFS_CHAIN_ID
+#fi
+
-- 
GitLab