#!/bin/sh

LOCAL_ASYNC_PORT=1080
REMOTE_ASYNC_PORT=1080
LINTER_MBX=20561
export LINTER_MBX

M_RUNNING_ALREADY='Linter is already running.'
M_LINTER_NOT_RUN='Linter is not running'
M_PROC_ASYNC_SCRIPT="Create asynchrounus replication scripts"
M_A_INCORRECT_RUN="This procedure must be started from the Linter root directory."
M_A_NOT_RUN="This procedure is auxiliary. To configure DBMS startup
call ./scripts/make_scripts or ./scripts/create_database"
M_A_INFO="Asynchronous replication component provides bi-directional data replication 
feature. The data are replicated between remote database and local database.
In order to setup the replication rules, the remote database properties 
shall be assigned."
Q_A_REMOTE_NODE="Enter remote database server name (no longer than 8 chars) or empty string (to finish remote database list creation)"
Q_A_REMOTE_ADDRESS="Enter TCPIP address for database \\\"\$REMOTE_NAME\\\""
Q_A_CORRECT_ADDRESS="Address \\\"\$REMOTE_ADDRESS\\\" is correct for database \\\"\$REMOTE_NAME\\\""
NODETAB_HEADER="# Information about database servers in the following format:
#+-----------------------------------------------------------------------------------------+
#| Linter Server| Protocol  |  Network Address | Port Number |  Close  |Alive  | Connect |
#|              |           |                  |             | timeout |timeout | timeout |
#+-----------------------------------------------------------------------------------------+
# Linter Server   - logical server name as used in applications
# Protocol        - network protocol. TCPIP, TCPIPS, LOCAL are supported
# Network Address - address of the Linter server in the server protocolformat
# Port Number     - port number of the Linter server. The default value is 1060
# Close timeout   - time interval in minutes between server daemon's checkings
#                   if client daemon is alive. Not required.
# Alive timeout   - time interval in seconds between client daemon's checkings
#                   if server daemon is alive. Not required.
# Connect timeout - time in seconds. If the connection has not been established
#                   up to this time interval, an error will be returned. Not required."




[ -f ./scripts/dialog.sh ] || {
  echo "$M_A_INCORRECT_RUN"
  exit 1
  }

[ A"$LINTER_DIR" = A ] && {
  echo $M_A_NOT_RUN
  exit 1
  }

. ./scripts/dialog.sh

[ "$INSTALL_LANG" = "" ] || {
  [ -f make_async_scripts."$INSTALL_LANG" ] && {
    . make_async_scripts."$INSTALL_LANG"
  }
  [ -f scripts/make_async_scripts."$INSTALL_LANG" ] && {
    . scripts/make_async_scripts."$INSTALL_LANG"
  }
}


push_path "$M_PROC_ASYNC_SCRIPT"

NODE_LIST=""

list_nodes()
{
  echo "NAME                ADDRESS            "
  echo "------------------- -------------------"
  for i in $NODE_LIST""; do
    echo "$i" | $AWKRUN -F ":" '{printf "%-20s%-20s\n",$1,$2;} '
  done    
  echo "---------------------------------------"
}

echo $M_A_INFO
while [ 1 -eq 1 ]; do
  input_value "A_REMOTE_NODE"
  REMOTE_NAME="$rets"
  [ "$REMOTE_NAME"A = A ] && break
  input_value "A_REMOTE_ADDRESS"
  REMOTE_ADDRESS="$rets"
  def_yes_no "A_CORRECT_ADDRESS" N || continue
  NODE_LIST="$NODE_LIST $REMOTE_NAME:$REMOTE_ADDRESS"
  list_nodes
done
list_nodes

. "$LINTER_DIR"/bin/private_passwd

NO_AR=1
export NO_AR

"$LINTER_DIR"/bin/start_linter.sh

#IS_QNX=`uname -a| $AWKRUN 'BEGIN{i=0} /qnx/{i=1} /QNX/{i=1} END{print i}'`
IS_QNX=0

echo "$NODETAB_HEADER" >"$LINTER_DIR"/bin/nodetab
if [ $IS_QNX -eq 0 ]; then
  echo "REPLSERV local 20571" >> "$LINTER_DIR"/bin/nodetab
else  
  REPL_DBS_PORT=`expr $LOCAL_ASYNC_PORT + 1`
  echo "REPLSERV TCPIP 127.0.0.1 $REPL_DBS_PORT" >> "$LINTER_DIR"/bin/nodetab
fi

. "$LINTER_DIR"/bin/config_lin.sh
export LINTER_MBX

for i in $NODE_LIST""; do
  [ "$i" = "" ] && continue
  REMOTE_NAME=`echo "$i" | $AWKRUN -F ":" '{print $1;}'`
  REMOTE_ADDRESS=`echo "$i" | $AWKRUN -F ":" '{print $2;}'`
  echo "$REMOTE_NAME ATCPIP $REMOTE_ADDRESS $REMOTE_ASYNC_PORT">>"$LINTER_DIR"/bin/nodetab
  echo "create server $REMOTE_NAME;" | "$LINTER_DIR"/bin/inl -u "\"$USER\""/"\"$PASSWORD\""
done
"$LINTER_DIR"/bin/stop_linter.sh

echo 'STORAGE_USER="SYSTEM"
STORAGE_PASSWORD="MANAGER"
' >> "$LINTER_DIR"/bin/private_passwd

echo '
STORAGE_MBX=20571
STORAGE_POOL=1000
STORAGE_SPOOL=500
STORAGE_TRACE_LEVEL=1
STORAGE_SY00="'$DATABASE_DIR'/storage"
STORAGE_PORT='$LOCAL_ASYNC_PORT'
STORAGE_DBS_PORT='$REPL_DBS_PORT'
STORAGE_CONFIG_FILE="$LINTER_DIR"/bin/lreplserver.cfg
' >> "$LINTER_DIR"/bin/config_lin.sh

echo '#!/bin/sh
LINTER_DIR="'$LINTER_DIR'"

. "$LINTER_DIR"/bin/config_lin.sh
SAVE_MBX=$LINTER_MBX
SAVE_NET_MBX=$NET_MBX
LINTER_MBX=$STORAGE_MBX
NET_MBX=$STORAGE_MBX
export LINTER_MBX NET_MBX

. "$LINTER_BIN"/private_passwd

is_running()
    {
    LINTER_NET_MBX=$NET_MBX
    NET_MBX=$LINTER_MBX
    export NET_MBX

    "$LINTER_BIN"/chklinter -r -u "\"$STORAGE_USER\""/"\"$STORAGE_PASSWORD\""
    rets=$?

    NET_MBX=$LINTER_NET_MBX
    export NET_MBX
    return $rets;
    };

is_running && {
  echo "'"$M_RUNNING_ALREADY"'"
  exit 1
  }

'>"$LINTER_DIR"/bin/async_start.sh
if [ $IS_QNX -eq 0 ]; then
echo '"$LINTER_BIN"/linter /BASE="$STORAGE_SY00" /POOL=$STORAGE_POOL /SPOOL=$STORAGE_SPOOL >/dev/null'>>"$LINTER_DIR"/bin/async_start.sh
else
echo '"$LINTER_BIN"/linter /BASE="$STORAGE_SY00" /POOL=$STORAGE_POOL /SPOOL=$STORAGE_SPOOL /TCP=$STORAGE_DBS_PORT >/dev/null'>>"$LINTER_DIR"/bin/async_start.sh
fi
echo '
for i in 3 5 10 15; do
  sleep $i
  if is_running; then
    break
  fi
done

LINTER_MBX=$SAVE_MBX
NET_MBX=$SAVE_NET_MBX
export LINTER_MBX NET_MBX

[ -f "$DBC_PID_FILE" ] || {
  "$LINTER_BIN"/dbc_tcp /p="$DBC_PID_FILE" /n="$NODETAB_FILE"
  sleep 3
  }

umask 077

echo "-us=\"$STORAGE_USER\"/\"$STORAGE_PASSWORD\" -u=\"$USER\"/\"$PASSWORD\" -s=REPLSERV -p=$STORAGE_PORT -t=0 -log=$STORAGE_TRACE_LEVEL -n=$NODETAB_FILE" > "$STORAGE_CONFIG_FILE"
"$LINTER_BIN"/lreplserver -daemon -cfg "$STORAGE_CONFIG_FILE" >/dev/null
'>>"$LINTER_DIR"/bin/async_start.sh
chmod a+x "$LINTER_DIR"/bin/async_start.sh

echo '#!/bin/sh
LINTER_DIR="'$LINTER_DIR'"

. "$LINTER_DIR"/bin/config_lin.sh

SAVE_NET_MBX=$NET_MBX
SAVE_MBX=$LINTER_MBX
LINTER_MBX=$STORAGE_MBX
NET_MBX=$LINTER_MBX
export LINTER_MBX NET_MBX

. "$LINTER_BIN"/private_passwd

is_running()
    {
    LINTER_NET_MBX=$NET_MBX
    NET_MBX=$LINTER_MBX
    export NET_MBX

    "$LINTER_BIN"/chklinter -r -u "\"$STORAGE_USER\""/"\"$STORAGE_PASSWORD\""
    rets=$?

    NET_MBX=$LINTER_NET_MBX
    export NET_MBX
    return $rets;
    };

cd "$STORAGE_SY00"
is_running || {
  echo "'"$M_LINTER_NOT_RUN"'"
  exit 1
  }

"$LINTER_BIN"/lreplserver -down >/dev/null
rm -rf "$STORAGE_CONFIG_FILE"

[ -f "$DBC_PID_FILE" ] && {
  kill `cat "$DBC_PID_FILE"`
  rm -f "$DBC_PID_FILE"
  }

"$LINTER_BIN"/shut -u "$STORAGE_USER"/"$STORAGE_PASSWORD" -r >/dev/null &

for i in 1 3 5 10; do
  if is_running;then
    sleep $i
  fi            
done

' > "$LINTER_DIR"/bin/async_stop.sh
chmod a+x "$LINTER_DIR"/bin/async_stop.sh

pop_path

