#!/bin/bash
if [ -f /usr/share/lib/geth-utils/geth-utils.include.sh ]; then source /usr/share/lib/geth-utils/geth-utils.include.sh; fi
if [ -f /etc/geth-utils/geth.conf ]; then source /etc/geth-utils/geth.conf; fi
if [ "$1" = "-c" -o "$1" = "--chain" ]; then CMDLINECHAIN="$2";shift;shift; fi; _defineChain
if [ -n "$ONLYUSER" -a "`whoami`" != "$ONLYUSER" ]; then echo "Only to be called es user >$ONLYUSER<"; exit 17; fi
if [ "`whoami`" = "root" ]; then echo "Not to be called as user >root<"; exit 17; fi

GETH="geth --nousb --metrics --datadir $GETHDIR/$CHAIN -ipcpath $GETHDIR/$CHAIN/geth.ipc"
LOGFILE=$GETHDIR/$CHAIN/eth.log

_usage () {
   echo "Usage: `basename $0` [ -c CHAIN | --chain CHAIN ]"
   echo "Usage: `basename $0` [ -h | --help ]"
   echo "Usage: `basename $0` [ -v | --version ]"
}

_version () {
   echo "them-geth-utils Version $GVERSION"
}

if [ "$1" = "-h" -o "$1" = "--help" ]; then
   _usage
   exit 17
fi

if [ "$1" = "-v" -o "$1" == "--version" ]; then
   _version
   exit 17
fi

echo "Doing `basename $0` for Chain $CHAIN" >&2

if [ \! -f "$1" ]; then
  FILE=$HOME/peers.$CHAIN
else
  FILE=$1
#  echo "Usage: `basename $0` FILE"
#  exit 17
fi

if [ $CHAIN = loc ]; then

   echo "ERROR: local chain has no peers." >&2
   exit 17

else

   if [ \! -S $GETHDIR/$CHAIN/geth.ipc ]; then
   echo "ERROR: geth seems not to be running for chain $CHAIN on socket $GETHDIR/$CHAIN/geth.ipc." >&2
   exit 17
   fi

   TMP=/tmp/gcollectpeers$$

   touch $FILE
   cp $FILE $TMP

   $GETH -exec admin.peers attach | sed '1,$ s/^[ \t]*\([a-zA-Z0-9_]*\):/"\1":/g' | jq '.[]|select(.network.inbound==false)|.enode' | tr -d '"' > $TMP
# jq '.[]|.network|select(.inbound==false)|.remoteAddress' 

    cat $TMP | sort -u | while read PEER; do
        ID=`echo $PEER | cut -d '@' -f 2 | cut -d '?' -f 1`
        IP=`echo $ID | cut -d ':' -f 1`
        P=`echo $ID | cut -d ':' -f 2`
        if nc -w 1 -z $IP $P; then
            echo "$HOSTNAME: Probing peer $IP port $P. Ok. Accepting it as peer." >&2
            echo "$PEER" >> ${TMP}.2
        else
            echo "$HOSTNAME: Probing peer $IP port $P. No connection. Rejected." >&2
        fi
    done

# diff $FILE ${TMP}.2 >&2 2>/dev/null
    diff $FILE ${TMP}.2 2>/dev/null | awk "{printf \"$HOSTNAME: %s\\n\",\$0}" | egrep '<|>' >&2
    mv ${TMP}.2 $FILE
    rm ${TMP}

fi
