install.sh 30.9 KB
Newer Older
H
hzcheng 已提交
1 2
#!/bin/bash
#
L
lihui 已提交
3
# This file is used to install database on linux systems. The operating system
H
hzcheng 已提交
4 5 6 7 8
# is required to use systemd to manage services at boot

set -e
#set -x

L
lihui 已提交
9 10
verMode=edge
pagMode=full
S
slguan 已提交
11

H
Hui Li 已提交
12 13 14
iplist=""
serverFqdn=""

H
hzcheng 已提交
15
# -----------------------Variables definition---------------------
F
Frozen 已提交
16
script_dir=$(dirname $(readlink -f "$0"))
H
hzcheng 已提交
17
# Dynamic directory
18

19 20 21 22 23 24 25 26 27 28 29 30
clientName="taos"
serverName="taosd"
configFile="taos.cfg"
productName="TDengine"
emailName="taosdata.com"
uninstallScript="rmtaos"
historyFile="taos_history"
tarName="taos.tar.gz"
dataDir="/var/lib/taos"
logDir="/var/log/taos"
configDir="/etc/taos"
installDir="/usr/local/taos"
31 32 33 34
adapterName="taosadapter"
benchmarkName="taosBenchmark"
dumpName="taosdump"
demoName="taosdemo"
35 36 37 38

data_dir=${dataDir}
log_dir=${logDir}
cfg_install_dir=${configDir}
H
hzcheng 已提交
39 40 41

bin_link_dir="/usr/bin"
lib_link_dir="/usr/lib"
H
Hui Li 已提交
42
lib64_link_dir="/usr/lib64"
H
hzcheng 已提交
43 44 45
inc_link_dir="/usr/include"

#install main path
46
install_main_dir=${installDir}
H
hzcheng 已提交
47
# old bin dir
48
bin_dir="${installDir}/bin"
S
slguan 已提交
49

H
hzcheng 已提交
50
service_config_dir="/etc/systemd/system"
S
slguan 已提交
51 52
nginx_port=6060
nginx_dir="/usr/local/nginxd"
H
hzcheng 已提交
53 54 55 56 57 58 59 60

# Color setting
RED='\033[0;31m'
GREEN='\033[1;32m'
GREEN_DARK='\033[0;32m'
GREEN_UNDERLINE='\033[4;32m'
NC='\033[0m'

P
plum-lihui 已提交
61
csudo=""
62 63
if command -v sudo >/dev/null; then
  csudo="sudo "
P
plum-lihui 已提交
64
fi
H
hzcheng 已提交
65

S
slguan 已提交
66
update_flag=0
67
prompt_force=0
S
slguan 已提交
68

L
lihui 已提交
69
initd_mod=0
P
plum-lihui 已提交
70
service_mod=2
71 72 73 74 75 76 77 78 79 80 81 82
if pidof systemd &>/dev/null; then
  service_mod=0
elif $(which service &>/dev/null); then
  service_mod=1
  service_config_dir="/etc/init.d"
  if $(which chkconfig &>/dev/null); then
    initd_mod=1
  elif $(which insserv &>/dev/null); then
    initd_mod=2
  elif $(which update-rc.d &>/dev/null); then
    initd_mod=3
  else
P
plum-lihui 已提交
83
    service_mod=2
84 85 86
  fi
else
  service_mod=2
H
hzcheng 已提交
87 88
fi

L
lihui 已提交
89 90 91
# get the operating system type for using the corresponding init file
# ubuntu/debian(deb), centos/fedora(rpm), others: opensuse, redhat, ..., no verification
#osinfo=$(awk -F= '/^NAME/{print $2}' /etc/os-release)
H
Hui Li 已提交
92
if [[ -e /etc/os-release ]]; then
93
  osinfo=$(cat /etc/os-release | grep "NAME" | cut -d '"' -f2) || :
H
Hui Li 已提交
94 95 96
else
  osinfo=""
fi
L
lihui 已提交
97 98
#echo "osinfo: ${osinfo}"
os_type=0
99 100
if echo $osinfo | grep -qwi "ubuntu"; then
  #  echo "This is ubuntu system"
L
lihui 已提交
101
  os_type=1
102 103
elif echo $osinfo | grep -qwi "debian"; then
  #  echo "This is debian system"
L
lihui 已提交
104
  os_type=1
105 106
elif echo $osinfo | grep -qwi "Kylin"; then
  #  echo "This is Kylin system"
L
lihui 已提交
107
  os_type=1
108 109 110
elif echo $osinfo | grep -qwi "Red"; then
  #  echo "This is Red Hat system"
  os_type=1
111 112
elif echo $osinfo | grep -qwi "centos"; then
  #  echo "This is centos system"
L
lihui 已提交
113
  os_type=2
114 115
elif echo $osinfo | grep -qwi "fedora"; then
  #  echo "This is fedora system"
L
lihui 已提交
116
  os_type=2
117 118
elif echo $osinfo | grep -qwi "Linx"; then
  #  echo "This is Linx system"
haoranc's avatar
haoranc 已提交
119 120 121 122
  os_type=1
  service_mod=0
  initd_mod=0
  service_config_dir="/etc/systemd/system"
L
lihui 已提交
123
else
H
Hui Li 已提交
124
  echo " osinfo: ${osinfo}"
125
  echo " This is an officially unverified linux system,"
H
Hui Li 已提交
126
  echo " if there are any problems with the installation and operation, "
127
  echo " please feel free to contact ${emailName} for support."
L
lihui 已提交
128
  os_type=1
L
lihui 已提交
129 130
fi

H
Hui Li 已提交
131
# =============================  get input parameters =================================================
132 133 134

# install.sh -v [server | client]  -e [yes | no] -i [systemd | service | ...]

H
Hui Li 已提交
135
# set parameters by default value
136 137 138
interactiveFqdn=yes # [yes | no]
verType=server      # [server | client]
initType=systemd    # [systemd | service | ...]
H
Hui Li 已提交
139

140
while getopts "hv:e:i:" arg; do
H
Hui Li 已提交
141
  case $arg in
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
  e)
    #echo "interactiveFqdn=$OPTARG"
    interactiveFqdn=$(echo $OPTARG)
    ;;
  v)
    #echo "verType=$OPTARG"
    verType=$(echo $OPTARG)
    ;;
  i)
    #echo "initType=$OPTARG"
    initType=$(echo $OPTARG)
    ;;
  h)
    echo "Usage: $(basename $0) -v [server | client]  -e [yes | no]"
    exit 0
    ;;
  ?) #unknow option
    echo "unkonw argument"
    exit 1
    ;;
H
Hui Li 已提交
162 163 164
  esac
done

H
Hui Li 已提交
165
#echo "verType=${verType} interactiveFqdn=${interactiveFqdn}"
H
Hui Li 已提交
166

167 168
function kill_process() {
  pid=$(ps -ef | grep "$1" | grep -v "grep" | awk '{print $2}')
L
lihui 已提交
169
  if [ -n "$pid" ]; then
170
    ${csudo}kill -9 $pid || :
L
lihui 已提交
171
  fi
P
plum-lihui 已提交
172 173
}

H
hzcheng 已提交
174
function install_main_path() {
175 176 177 178 179
  #create install main dir and all sub dir
  ${csudo}rm -rf ${install_main_dir} || :
  ${csudo}mkdir -p ${install_main_dir}
  ${csudo}mkdir -p ${install_main_dir}/cfg
  ${csudo}mkdir -p ${install_main_dir}/bin
180
  #  ${csudo}mkdir -p ${install_main_dir}/connector
181 182 183
  ${csudo}mkdir -p ${install_main_dir}/driver
  ${csudo}mkdir -p ${install_main_dir}/examples
  ${csudo}mkdir -p ${install_main_dir}/include
184
  #  ${csudo}mkdir -p ${install_main_dir}/init.d
185 186 187
  if [ "$verMode" == "cluster" ]; then
    ${csudo}mkdir -p ${nginx_dir}
  fi
188

189 190 191
  if [[ -e ${script_dir}/email ]]; then
    ${csudo}cp ${script_dir}/email ${install_main_dir}/ || :
  fi
H
hzcheng 已提交
192 193 194
}

function install_bin() {
195 196 197
  # Remove links
  ${csudo}rm -f ${bin_link_dir}/${clientName} || :
  ${csudo}rm -f ${bin_link_dir}/${serverName} || :
198
  ${csudo}rm -f ${bin_link_dir}/${adapterName} || :
199 200 201
  ${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
  ${csudo}rm -f ${bin_link_dir}/tarbitrator || :
  ${csudo}rm -f ${bin_link_dir}/set_core || :
202
  ${csudo}rm -f ${bin_link_dir}/run_${serverName}_and_${adapterName}.sh || :
203
  ${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
204 205 206 207 208 209

  ${csudo}cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo}chmod 0555 ${install_main_dir}/bin/*

  #Make link
  [ -x ${install_main_dir}/bin/${clientName} ] && ${csudo}ln -s ${install_main_dir}/bin/${clientName} ${bin_link_dir}/${clientName} || :
  [ -x ${install_main_dir}/bin/${serverName} ] && ${csudo}ln -s ${install_main_dir}/bin/${serverName} ${bin_link_dir}/${serverName} || :
210 211 212
  [ -x ${install_main_dir}/bin/${adapterName} ] && ${csudo}ln -s ${install_main_dir}/bin/${adapterName} ${bin_link_dir}/${adapterName} || :
  [ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -s ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${demoName} || :
  [ -x ${install_main_dir}/bin/${benchmarkName} ] && ${csudo}ln -s ${install_main_dir}/bin/${benchmarkName} ${bin_link_dir}/${benchmarkName} || :
Z
zyyang 已提交
213
#  [ -x ${install_main_dir}/bin/${dumpName} ] && ${csudo}ln -s ${install_main_dir}/bin/${dumpName} ${bin_link_dir}/${dumpName} || :
214
  [ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -s ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
215 216
  [ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
  [ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
217
  [ -x ${install_main_dir}/bin/run_${serverName}_and_${adapterName}.sh ] && ${csudo}ln -s ${install_main_dir}/bin/run_${serverName}_and_${adapterName}.sh ${bin_link_dir}/run_${serverName}_and_${adapterName}.sh || :
218 219 220 221 222 223 224
  [ -x ${install_main_dir}/bin/tarbitrator ] && ${csudo}ln -s ${install_main_dir}/bin/tarbitrator ${bin_link_dir}/tarbitrator || :

  if [ "$verMode" == "cluster" ]; then
    ${csudo}cp -r ${script_dir}/nginxd/* ${nginx_dir} && ${csudo}chmod 0555 ${nginx_dir}/*
    ${csudo}mkdir -p ${nginx_dir}/logs
    ${csudo}chmod 777 ${nginx_dir}/sbin/nginx
  fi
H
hzcheng 已提交
225 226 227
}

function install_lib() {
228 229 230
  # Remove links
  ${csudo}rm -f ${lib_link_dir}/libtaos.* || :
  ${csudo}rm -f ${lib64_link_dir}/libtaos.* || :
231
  #${csudo}rm -rf ${v15_java_app_dir}              || :
232
  ${csudo}cp -rf ${script_dir}/driver/* ${install_main_dir}/driver && ${csudo}chmod 777 ${install_main_dir}/driver/*
233

234 235
  ${csudo}ln -s ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.so.1
  ${csudo}ln -s ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so
236

237 238 239 240 241 242
  if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then
    ${csudo}ln -s ${install_main_dir}/driver/libtaos.* ${lib64_link_dir}/libtaos.so.1 || :
    ${csudo}ln -s ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || :
  fi

  ${csudo}ldconfig
H
hzcheng 已提交
243 244
}

245
function install_avro() {
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
  if [ "$osType" != "Darwin" ]; then
    avro_dir=${script_dir}/avro
    if [ -f "${avro_dir}/lib/libavro.so.23.0.0" ] && [ -d /usr/local/$1 ]; then
      ${csudo}/usr/bin/install -c -d /usr/local/$1
      ${csudo}/usr/bin/install -c -m 755 ${avro_dir}/lib/libavro.so.23.0.0 /usr/local/$1
      ${csudo}ln -sf /usr/local/$1/libavro.so.23.0.0 /usr/local/$1/libavro.so.23
      ${csudo}ln -sf /usr/local/$1/libavro.so.23 /usr/local/$1/libavro.so

      ${csudo}/usr/bin/install -c -d /usr/local/$1
      [ -f ${avro_dir}/lib/libavro.a ] &&
        ${csudo}/usr/bin/install -c -m 755 ${avro_dir}/lib/libavro.a /usr/local/$1

      if [ -d /etc/ld.so.conf.d ]; then
        echo "/usr/local/$1" | ${csudo}tee /etc/ld.so.conf.d/libavro.conf >/dev/null || echo -e "failed to write /etc/ld.so.conf.d/libavro.conf"
        ${csudo}ldconfig
      else
        echo "/etc/ld.so.conf.d not found!"
      fi
264
    fi
265
  fi
266 267
}

268
function install_jemalloc() {
269
  jemalloc_dir=${script_dir}/jemalloc
270

271 272
  if [ -d ${jemalloc_dir} ]; then
    ${csudo}/usr/bin/install -c -d /usr/local/bin
273

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
    if [ -f ${jemalloc_dir}/bin/jemalloc-config ]; then
      ${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/bin/jemalloc-config /usr/local/bin
    fi
    if [ -f ${jemalloc_dir}/bin/jemalloc.sh ]; then
      ${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/bin/jemalloc.sh /usr/local/bin
    fi
    if [ -f ${jemalloc_dir}/bin/jeprof ]; then
      ${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/bin/jeprof /usr/local/bin
    fi
    if [ -f ${jemalloc_dir}/include/jemalloc/jemalloc.h ]; then
      ${csudo}/usr/bin/install -c -d /usr/local/include/jemalloc
      ${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/include/jemalloc/jemalloc.h /usr/local/include/jemalloc
    fi
    if [ -f ${jemalloc_dir}/lib/libjemalloc.so.2 ]; then
      ${csudo}/usr/bin/install -c -d /usr/local/lib
      ${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/lib/libjemalloc.so.2 /usr/local/lib
      ${csudo}ln -sf libjemalloc.so.2 /usr/local/lib/libjemalloc.so
      ${csudo}/usr/bin/install -c -d /usr/local/lib
      if [ -f ${jemalloc_dir}/lib/libjemalloc.a ]; then
        ${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/lib/libjemalloc.a /usr/local/lib
      fi
      if [ -f ${jemalloc_dir}/lib/libjemalloc_pic.a ]; then
        ${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/lib/libjemalloc_pic.a /usr/local/lib
      fi
      if [ -f ${jemalloc_dir}/lib/libjemalloc_pic.a ]; then
        ${csudo}/usr/bin/install -c -d /usr/local/lib/pkgconfig
        ${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/lib/pkgconfig/jemalloc.pc /usr/local/lib/pkgconfig
      fi
    fi
    if [ -f ${jemalloc_dir}/share/doc/jemalloc/jemalloc.html ]; then
      ${csudo}/usr/bin/install -c -d /usr/local/share/doc/jemalloc
      ${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/share/doc/jemalloc/jemalloc.html /usr/local/share/doc/jemalloc
    fi
    if [ -f ${jemalloc_dir}/share/man/man3/jemalloc.3 ]; then
      ${csudo}/usr/bin/install -c -d /usr/local/share/man/man3
      ${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
    fi
311

312 313 314 315 316
    if [ -d /etc/ld.so.conf.d ]; then
      echo "/usr/local/lib" | ${csudo}tee /etc/ld.so.conf.d/jemalloc.conf >/dev/null || echo -e "failed to write /etc/ld.so.conf.d/jemalloc.conf"
      ${csudo}ldconfig
    else
      echo "/etc/ld.so.conf.d not found!"
317
    fi
318
  fi
319 320
}

H
hzcheng 已提交
321
function install_header() {
322 323 324 325 326
  ${csudo}rm -f ${inc_link_dir}/taos.h ${inc_link_dir}/taosdef.h ${inc_link_dir}/taoserror.h || :
  ${csudo}cp -f ${script_dir}/inc/* ${install_main_dir}/include && ${csudo}chmod 644 ${install_main_dir}/include/*
  ${csudo}ln -s ${install_main_dir}/include/taos.h ${inc_link_dir}/taos.h
  ${csudo}ln -s ${install_main_dir}/include/taosdef.h ${inc_link_dir}/taosdef.h
  ${csudo}ln -s ${install_main_dir}/include/taoserror.h ${inc_link_dir}/taoserror.h
H
hzcheng 已提交
327 328
}

H
Hui Li 已提交
329 330 331 332 333 334 335
function add_newHostname_to_hosts() {
  localIp="127.0.0.1"
  OLD_IFS="$IFS"
  IFS=" "
  iphost=$(cat /etc/hosts | grep $1 | awk '{print $1}')
  arr=($iphost)
  IFS="$OLD_IFS"
336
  for s in "${arr[@]}"; do
H
Hui Li 已提交
337 338 339
    if [[ "$s" == "$localIp" ]]; then
      return
    fi
340
  done
341
  ${csudo}echo "127.0.0.1  $1" >>/etc/hosts || :
H
Hui Li 已提交
342 343 344 345
}

function set_hostname() {
  echo -e -n "${GREEN}Please enter one hostname(must not be 'localhost')${NC}:"
346
  read newHostname
H
Hui Li 已提交
347 348 349 350 351 352 353 354
  while true; do
    if [[ ! -z "$newHostname" && "$newHostname" != "localhost" ]]; then
      break
    else
      read -p "Please enter one hostname(must not be 'localhost'):" newHostname
    fi
  done

355 356
  ${csudo}hostname $newHostname || :
  retval=$(echo $?)
H
Hui Li 已提交
357
  if [[ $retval != 0 ]]; then
358 359 360
    echo
    echo "set hostname fail!"
    return
H
Hui Li 已提交
361
  fi
362

H
Hui Li 已提交
363 364
  #ubuntu/centos /etc/hostname
  if [[ -e /etc/hostname ]]; then
365
    ${csudo}echo $newHostname >/etc/hostname || :
H
Hui Li 已提交
366
  fi
367

H
Hui Li 已提交
368 369
  #debian: #HOSTNAME=yourname
  if [[ -e /etc/sysconfig/network ]]; then
370
    ${csudo}sed -i -r "s/#*\s*(HOSTNAME=\s*).*/\1$newHostname/" /etc/sysconfig/network || :
H
Hui Li 已提交
371 372
  fi

373
  ${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$newHostname/" ${cfg_install_dir}/${configFile}
374 375
  serverFqdn=$newHostname

H
Hui Li 已提交
376 377 378 379 380 381 382 383 384 385 386
  if [[ -e /etc/hosts ]]; then
    add_newHostname_to_hosts $newHostname
  fi
}

function is_correct_ipaddr() {
  newIp=$1
  OLD_IFS="$IFS"
  IFS=" "
  arr=($iplist)
  IFS="$OLD_IFS"
387 388 389 390
  for s in "${arr[@]}"; do
    if [[ "$s" == "$newIp" ]]; then
      return 0
    fi
H
Hui Li 已提交
391
  done
392

H
Hui Li 已提交
393 394 395 396
  return 1
}

function set_ipAsFqdn() {
397
  iplist=$(ip address | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}' | awk -F "/" '{print $1}') || :
H
Hui Li 已提交
398
  if [ -z "$iplist" ]; then
399
    iplist=$(ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}' | awk -F ":" '{print $2}') || :
H
Hui Li 已提交
400 401 402 403 404 405
  fi

  if [ -z "$iplist" ]; then
    echo
    echo -e -n "${GREEN}Unable to get local ip, use 127.0.0.1${NC}"
    localFqdn="127.0.0.1"
406
    # Write the local FQDN to configuration file
407
    ${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/${configFile}
H
Hui Li 已提交
408 409 410
    serverFqdn=$localFqdn
    echo
    return
411 412
  fi

H
Hui Li 已提交
413 414 415 416 417 418 419
  echo -e -n "${GREEN}Please choose an IP from local IP list${NC}:"
  echo
  echo -e -n "${GREEN}$iplist${NC}"
  echo
  echo
  echo -e -n "${GREEN}Notes: if IP is used as the node name, data can NOT be migrated to other machine directly${NC}:"
  read localFqdn
420 421 422 423 424 425
  while true; do
    if [ ! -z "$localFqdn" ]; then
      # Check if correct ip address
      is_correct_ipaddr $localFqdn
      retval=$(echo $?)
      if [[ $retval != 0 ]]; then
H
Hui Li 已提交
426
        read -p "Please choose an IP from local IP list:" localFqdn
427 428 429 430 431
      else
        # Write the local FQDN to configuration file
        ${csudo}sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/${configFile}
        serverFqdn=$localFqdn
        break
H
Hui Li 已提交
432
      fi
433 434 435 436
    else
      read -p "Please choose an IP from local IP list:" localFqdn
    fi
  done
H
Hui Li 已提交
437 438 439
}

function local_fqdn_check() {
H
[NONE]  
Hui Li 已提交
440
  #serverFqdn=$(hostname)
H
Hui Li 已提交
441 442 443
  echo
  echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
  echo
444
  if [[ "$serverFqdn" == "" ]] || [[ "$serverFqdn" == "localhost" ]]; then
H
Hui Li 已提交
445 446
    echo -e -n "${GREEN}It is strongly recommended to configure a hostname for this machine ${NC}"
    echo
447

448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
    while true; do
      read -r -p "Set hostname now? [Y/n] " input
      if [ ! -n "$input" ]; then
        set_hostname
        break
      else
        case $input in
        [yY][eE][sS] | [yY])
          set_hostname
          break
          ;;

        [nN][oO] | [nN])
          set_ipAsFqdn
          break
          ;;

        *)
          echo "Invalid input..."
          ;;
        esac
      fi
H
Hui Li 已提交
470 471 472 473
    done
  fi
}

474 475
function install_adapter_config() {
  if [ ! -f "${cfg_install_dir}/${adapterName}.toml" ]; then
476
    ${csudo}mkdir -p ${cfg_install_dir}
477 478
    [ -f ${script_dir}/cfg/${adapterName}.toml ] && ${csudo}cp ${script_dir}/cfg/${adapterName}.toml ${cfg_install_dir}
    [ -f ${cfg_install_dir}/${adapterName}.toml ] && ${csudo}chmod 644 ${cfg_install_dir}/${adapterName}.toml
479
  fi
480

481 482
  [ -f ${script_dir}/cfg/${adapterName}.toml ] &&
    ${csudo}cp -f ${script_dir}/cfg/${adapterName}.toml ${cfg_install_dir}/${adapterName}.toml.new
483

484 485
  [ -f ${cfg_install_dir}/${adapterName}.toml ] &&
    ${csudo}ln -s ${cfg_install_dir}/${adapterName}.toml ${install_main_dir}/cfg/${adapterName}.toml
486

487
  [ ! -z $1 ] && return 0 || : # only install client
488 489 490

}

H
hzcheng 已提交
491
function install_config() {
492

493 494 495 496 497
  if [ ! -f "${cfg_install_dir}/${configFile}" ]; then
    ${csudo}mkdir -p ${cfg_install_dir}
    [ -f ${script_dir}/cfg/${configFile} ] && ${csudo}cp ${script_dir}/cfg/${configFile} ${cfg_install_dir}
    ${csudo}chmod 644 ${cfg_install_dir}/*
  fi
498

499 500
  ${csudo}cp -f ${script_dir}/cfg/${configFile} ${cfg_install_dir}/${configFile}.new
  ${csudo}ln -s ${cfg_install_dir}/${configFile} ${install_main_dir}/cfg
S
slguan 已提交
501

502
  [ ! -z $1 ] && return 0 || : # only install client
503

504 505 506
  if ((${update_flag} == 1)); then
    return 0
  fi
507

508 509 510
  if [ "$interactiveFqdn" == "no" ]; then
    return 0
  fi
511

512
  local_fqdn_check
S
slguan 已提交
513

514 515 516 517 518 519 520 521 522 523 524 525 526
  echo
  echo -e -n "${GREEN}Enter FQDN:port (like h1.${emailName}:6030) of an existing ${productName} cluster node to join${NC}"
  echo
  echo -e -n "${GREEN}OR leave it blank to build one${NC}:"
  read firstEp
  while true; do
    if [ ! -z "$firstEp" ]; then
      ${csudo}sed -i -r "s/#*\s*(firstEp\s*).*/\1$firstEp/" ${cfg_install_dir}/${configFile}
      break
    else
      break
    fi
  done
H
Hui Li 已提交
527

528 529 530 531 532 533 534 535 536 537 538 539
  echo
  echo -e -n "${GREEN}Enter your email address for priority support or enter empty to skip${NC}: "
  read emailAddr
  while true; do
    if [ ! -z "$emailAddr" ]; then
      email_file="${install_main_dir}/email"
      ${csudo}bash -c "echo $emailAddr > ${email_file}"
      break
    else
      break
    fi
  done
H
hzcheng 已提交
540 541 542
}

function install_log() {
543 544
  ${csudo}rm -rf ${log_dir} || :
  ${csudo}mkdir -p ${log_dir} && ${csudo}chmod 777 ${log_dir}
545

546
  ${csudo}ln -s ${log_dir} ${install_main_dir}/log
H
hzcheng 已提交
547 548 549
}

function install_data() {
550
  ${csudo}mkdir -p ${data_dir}
551

552
  ${csudo}ln -s ${data_dir} ${install_main_dir}/data
H
hzcheng 已提交
553 554 555
}

function install_connector() {
556
  [ -d "${script_dir}/connector/" ] && ${csudo}cp -rf ${script_dir}/connector/ ${install_main_dir}/
H
hzcheng 已提交
557 558 559
}

function install_examples() {
560 561 562
  if [ -d ${script_dir}/examples ]; then
    ${csudo}cp -rf ${script_dir}/examples/* ${install_main_dir}/examples
  fi
H
hzcheng 已提交
563 564 565
}

function clean_service_on_sysvinit() {
566 567 568
  if pidof ${serverName} &>/dev/null; then
    ${csudo}service ${serverName} stop || :
  fi
569

570 571 572
  if pidof tarbitrator &>/dev/null; then
    ${csudo}service tarbitratord stop || :
  fi
573

574 575 576
  if ((${initd_mod} == 1)); then
    if [ -e ${service_config_dir}/${serverName} ]; then
      ${csudo}chkconfig --del ${serverName} || :
H
Hui Li 已提交
577
    fi
L
lihui 已提交
578

579 580 581 582 583 584 585 586 587 588 589 590 591
    if [ -e ${service_config_dir}/tarbitratord ]; then
      ${csudo}chkconfig --del tarbitratord || :
    fi
  elif ((${initd_mod} == 2)); then
    if [ -e ${service_config_dir}/${serverName} ]; then
      ${csudo}insserv -r ${serverName} || :
    fi
    if [ -e ${service_config_dir}/tarbitratord ]; then
      ${csudo}insserv -r tarbitratord || :
    fi
  elif ((${initd_mod} == 3)); then
    if [ -e ${service_config_dir}/${serverName} ]; then
      ${csudo}update-rc.d -f ${serverName} remove || :
L
lihui 已提交
592
    fi
593 594 595 596
    if [ -e ${service_config_dir}/tarbitratord ]; then
      ${csudo}update-rc.d -f tarbitratord remove || :
    fi
  fi
597

598 599
  ${csudo}rm -f ${service_config_dir}/${serverName} || :
  ${csudo}rm -f ${service_config_dir}/tarbitratord || :
600

601 602 603
  if $(which init &>/dev/null); then
    ${csudo}init q || :
  fi
H
hzcheng 已提交
604 605 606
}

function install_service_on_sysvinit() {
607 608 609 610
  clean_service_on_sysvinit
  sleep 1

  if ((${os_type} == 1)); then
611
    #    ${csudo}cp -f ${script_dir}/init.d/${serverName}.deb ${install_main_dir}/init.d/${serverName}
612
    ${csudo}cp ${script_dir}/init.d/${serverName}.deb ${service_config_dir}/${serverName} && ${csudo}chmod a+x ${service_config_dir}/${serverName}
613
    #    ${csudo}cp -f ${script_dir}/init.d/tarbitratord.deb ${install_main_dir}/init.d/tarbitratord
614 615
    ${csudo}cp ${script_dir}/init.d/tarbitratord.deb ${service_config_dir}/tarbitratord && ${csudo}chmod a+x ${service_config_dir}/tarbitratord
  elif ((${os_type} == 2)); then
616
    #    ${csudo}cp -f ${script_dir}/init.d/${serverName}.rpm ${install_main_dir}/init.d/${serverName}
617
    ${csudo}cp ${script_dir}/init.d/${serverName}.rpm ${service_config_dir}/${serverName} && ${csudo}chmod a+x ${service_config_dir}/${serverName}
618
    #    ${csudo}cp -f ${script_dir}/init.d/tarbitratord.rpm ${install_main_dir}/init.d/tarbitratord
619 620
    ${csudo}cp ${script_dir}/init.d/tarbitratord.rpm ${service_config_dir}/tarbitratord && ${csudo}chmod a+x ${service_config_dir}/tarbitratord
  fi
621

622 623 624 625 626 627 628 629 630 631 632 633 634 635
  if ((${initd_mod} == 1)); then
    ${csudo}chkconfig --add ${serverName} || :
    ${csudo}chkconfig --level 2345 ${serverName} on || :
    ${csudo}chkconfig --add tarbitratord || :
    ${csudo}chkconfig --level 2345 tarbitratord on || :
  elif ((${initd_mod} == 2)); then
    ${csudo}insserv ${serverName} || :
    ${csudo}insserv -d ${serverName} || :
    ${csudo}insserv tarbitratord || :
    ${csudo}insserv -d tarbitratord || :
  elif ((${initd_mod} == 3)); then
    ${csudo}update-rc.d ${serverName} defaults || :
    ${csudo}update-rc.d tarbitratord defaults || :
  fi
H
hzcheng 已提交
636 637 638
}

function clean_service_on_systemd() {
639 640 641 642 643 644 645
  taosd_service_config="${service_config_dir}/${serverName}.service"
  if systemctl is-active --quiet ${serverName}; then
    echo "${productName} is running, stopping it..."
    ${csudo}systemctl stop ${serverName} &>/dev/null || echo &>/dev/null
  fi
  ${csudo}systemctl disable ${serverName} &>/dev/null || echo &>/dev/null
  ${csudo}rm -f ${taosd_service_config}
646

647 648 649 650 651 652 653
  tarbitratord_service_config="${service_config_dir}/tarbitratord.service"
  if systemctl is-active --quiet tarbitratord; then
    echo "tarbitrator is running, stopping it..."
    ${csudo}systemctl stop tarbitratord &>/dev/null || echo &>/dev/null
  fi
  ${csudo}systemctl disable tarbitratord &>/dev/null || echo &>/dev/null
  ${csudo}rm -f ${tarbitratord_service_config}
654

655 656 657 658 659
  if [ "$verMode" == "cluster" ]; then
    nginx_service_config="${service_config_dir}/nginxd.service"
    if systemctl is-active --quiet nginxd; then
      echo "Nginx for ${productName} is running, stopping it..."
      ${csudo}systemctl stop nginxd &>/dev/null || echo &>/dev/null
660
    fi
661 662 663
    ${csudo}systemctl disable nginxd &>/dev/null || echo &>/dev/null
    ${csudo}rm -f ${nginx_service_config}
  fi
S
slguan 已提交
664
}
H
hzcheng 已提交
665 666

function install_service_on_systemd() {
667
  clean_service_on_systemd
H
hzcheng 已提交
668

669 670 671 672
  [ -f ${script_dir}/cfg/${serverName}.service ] &&
    ${csudo}cp ${script_dir}/cfg/${serverName}.service \
      ${service_config_dir}/ || :
  ${csudo}systemctl daemon-reload
673

674
  ${csudo}systemctl enable ${serverName}
675

676 677 678 679
  [ -f ${script_dir}/cfg/tarbitratord.service ] &&
    ${csudo}cp ${script_dir}/cfg/tarbitratord.service \
      ${service_config_dir}/ || :
  ${csudo}systemctl daemon-reload
680

681 682 683 684 685
  if [ "$verMode" == "cluster" ]; then
    [ -f ${script_dir}/cfg/nginxd.service ] &&
      ${csudo}cp ${script_dir}/cfg/nginxd.service \
        ${service_config_dir}/ || :
    ${csudo}systemctl daemon-reload
686

687 688 689 690 691
    if ! ${csudo}systemctl enable nginxd &>/dev/null; then
      ${csudo}systemctl daemon-reexec
      ${csudo}systemctl enable nginxd
    fi
    ${csudo}systemctl start nginxd
692
  fi
H
hzcheng 已提交
693 694
}

695
function install_adapter_service() {
696
  if ((${service_mod} == 0)); then
697 698
    [ -f ${script_dir}/cfg/${adapterName}.service ] &&
      ${csudo}cp ${script_dir}/cfg/${adapterName}.service \
699 700 701
        ${service_config_dir}/ || :
    ${csudo}systemctl daemon-reload
  fi
702 703
}

H
hzcheng 已提交
704
function install_service() {
705 706 707 708 709 710 711
  if ((${service_mod} == 0)); then
    install_service_on_systemd
  elif ((${service_mod} == 1)); then
    install_service_on_sysvinit
  else
    kill_process ${serverName}
  fi
H
hzcheng 已提交
712 713
}

714 715
vercomp() {
  if [[ $1 == $2 ]]; then
H
hzcheng 已提交
716
    return 0
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
  fi
  local IFS=.
  local i ver1=($1) ver2=($2)
  # fill empty fields in ver1 with zeros
  for ((i = ${#ver1[@]}; i < ${#ver2[@]}; i++)); do
    ver1[i]=0
  done

  for ((i = 0; i < ${#ver1[@]}; i++)); do
    if [[ -z ${ver2[i]} ]]; then
      # fill empty fields in ver2 with zeros
      ver2[i]=0
    fi
    if ((10#${ver1[i]} > 10#${ver2[i]})); then
      return 1
    fi
    if ((10#${ver1[i]} < 10#${ver2[i]})); then
      return 2
    fi
  done
  return 0
H
hzcheng 已提交
738 739 740 741
}

function is_version_compatible() {

742
  curr_version=$(ls ${script_dir}/driver/libtaos.so* | awk -F 'libtaos.so.' '{print $2}')
H
hzcheng 已提交
743

744 745 746 747 748
  if [ -f ${script_dir}/driver/vercomp.txt ]; then
    min_compatible_version=$(cat ${script_dir}/driver/vercomp.txt)
  else
    min_compatible_version=$(${script_dir}/bin/${serverName} -V | head -1 | cut -d ' ' -f 5)
  fi
H
hzcheng 已提交
749

750 751 752 753 754 755 756
  exist_version=$(${installDir}/bin/${serverName} -V | head -1 | cut -d ' ' -f 3)
  vercomp $exist_version "2.0.16.0"
  case $? in
  2)
    prompt_force=1
    ;;
  esac
757

758 759
  vercomp $curr_version $min_compatible_version
  echo "" # avoid $? value not update
760

761 762 763 764 765
  case $? in
  0) return 0 ;;
  1) return 0 ;;
  2) return 1 ;;
  esac
H
hzcheng 已提交
766 767
}

768
function updateProduct() {
769 770 771 772 773
  # Check if version compatible
  if ! is_version_compatible; then
    echo -e "${RED}Version incompatible${NC}"
    return 1
  fi
774

775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791
  # Start to update
  if [ ! -e ${tarName} ]; then
    echo "File ${tarName} does not exist"
    exit 1
  fi
  tar -zxf ${tarName}
  install_jemalloc

  echo -e "${GREEN}Start to update ${productName}...${NC}"
  # Stop the service if running
  if pidof ${serverName} &>/dev/null; then
    if ((${service_mod} == 0)); then
      ${csudo}systemctl stop ${serverName} || :
    elif ((${service_mod} == 1)); then
      ${csudo}service ${serverName} stop || :
    else
      kill_process ${serverName}
792
    fi
793 794
    sleep 1
  fi
795

796 797 798 799 800 801 802 803
  if [ "$verMode" == "cluster" ]; then
    if pidof nginx &>/dev/null; then
      if ((${service_mod} == 0)); then
        ${csudo}systemctl stop nginxd || :
      elif ((${service_mod} == 1)); then
        ${csudo}service nginxd stop || :
      else
        kill_process nginx
804
      fi
805
      sleep 1
H
hzcheng 已提交
806
    fi
807
  fi
808

809
  install_main_path
H
hzcheng 已提交
810

811 812 813
  install_log
  install_header
  install_lib
814 815 816 817 818

  if [ "$verMode" == "cluster" ]; then
      install_connector
  fi

819 820 821 822
  install_examples
  if [ -z $1 ]; then
    install_bin
    install_service
823
    install_adapter_service
824
    install_config
825
    install_adapter_config
826 827 828 829 830 831 832 833 834

    openresty_work=false
    if [ "$verMode" == "cluster" ]; then
      # Check if openresty is installed
      # Check if nginx is installed successfully
      if type curl &>/dev/null; then
        if curl -sSf http://127.0.0.1:${nginx_port} &>/dev/null; then
          echo -e "\033[44;32;1mNginx for ${productName} is updated successfully!${NC}"
          openresty_work=true
H
hzcheng 已提交
835
        else
836
          echo -e "\033[44;31;5mNginx for ${productName} does not work! Please try again!\033[0m"
H
hzcheng 已提交
837
        fi
838 839
      fi
    fi
H
hzcheng 已提交
840

841
    echo
842 843
    echo -e "${GREEN_DARK}To configure ${productName} ${NC}: edit ${cfg_install_dir}/${configFile}"
    echo -e "${GREEN_DARK}To configure Adapter (if has) ${NC}: edit ${cfg_install_dir}/${adapterName}.toml"
844 845 846 847 848
    if ((${service_mod} == 0)); then
      echo -e "${GREEN_DARK}To start ${productName}     ${NC}: ${csudo}systemctl start ${serverName}${NC}"
    elif ((${service_mod} == 1)); then
      echo -e "${GREEN_DARK}To start ${productName}     ${NC}: ${csudo}service ${serverName} start${NC}"
    else
849
      echo -e "${GREEN_DARK}To start Adapter (if has)${NC}: ${adapterName} &${NC}"
850 851
      echo -e "${GREEN_DARK}To start ${productName}     ${NC}: ./${serverName}${NC}"
    fi
852

853 854
    if [ ${openresty_work} = 'true' ]; then
      echo -e "${GREEN_DARK}To access ${productName}    ${NC}: use ${GREEN_UNDERLINE}${clientName} -h $serverFqdn${NC} in shell OR from ${GREEN_UNDERLINE}http://127.0.0.1:${nginx_port}${NC}"
H
hzcheng 已提交
855
    else
856 857
      echo -e "${GREEN_DARK}To access ${productName}    ${NC}: use ${GREEN_UNDERLINE}${clientName} -h $serverFqdn${NC} in shell${NC}"
    fi
H
hzcheng 已提交
858

859 860 861
    if ((${prompt_force} == 1)); then
      echo ""
      echo -e "${RED}Please run '${serverName} --force-keep-file' at first time for the exist ${productName} $exist_version!${NC}"
H
hzcheng 已提交
862
    fi
863 864 865 866 867 868 869 870 871
    echo
    echo -e "\033[44;32;1m${productName} is updated successfully!${NC}"
  else
    install_bin
    install_config

    echo
    echo -e "\033[44;32;1m${productName} client is updated successfully!${NC}"
  fi
H
hzcheng 已提交
872

873
  rm -rf $(tar -tf ${tarName} | grep -v "^\./$")
H
hzcheng 已提交
874 875
}

876
function installProduct() {
877 878 879 880 881 882
  # Start to install
  if [ ! -e ${tarName} ]; then
    echo "File ${tarName} does not exist"
    exit 1
  fi
  tar -zxf ${tarName}
883

884
  echo -e "${GREEN}Start to install ${productName}...${NC}"
885

886
  install_main_path
887

888 889 890
  if [ -z $1 ]; then
    install_data
  fi
891

892 893 894 895 896 897 898
  install_log
  install_header
  install_lib
  install_jemalloc
  #install_avro lib
  #install_avro lib64

899 900 901
  if [ "$verMode" == "cluster" ]; then
      install_connector
  fi
902 903 904 905 906 907
  install_examples

  if [ -z $1 ]; then # install service and client
    # For installing new
    install_bin
    install_service
908 909
    install_adapter_service
    install_adapter_config
910 911 912 913 914 915 916 917

    openresty_work=false
    if [ "$verMode" == "cluster" ]; then
      # Check if nginx is installed successfully
      if type curl &>/dev/null; then
        if curl -sSf http://127.0.0.1:${nginx_port} &>/dev/null; then
          echo -e "\033[44;32;1mNginx for ${productName} is installed successfully!${NC}"
          openresty_work=true
H
hzcheng 已提交
918
        else
919
          echo -e "\033[44;31;5mNginx for ${productName} does not work! Please try again!\033[0m"
920
        fi
921 922
      fi
    fi
H
Hui Li 已提交
923

924
    install_config
925

926 927
    # Ask if to start the service
    echo
928 929
    echo -e "${GREEN_DARK}To configure ${productName} ${NC}: edit ${cfg_install_dir}/${configFile}"
    echo -e "${GREEN_DARK}To configure ${adapterName} (if has) ${NC}: edit ${cfg_install_dir}/${adapterName}.toml"
930 931 932 933 934
    if ((${service_mod} == 0)); then
      echo -e "${GREEN_DARK}To start ${productName}     ${NC}: ${csudo}systemctl start ${serverName}${NC}"
    elif ((${service_mod} == 1)); then
      echo -e "${GREEN_DARK}To start ${productName}     ${NC}: ${csudo}service ${serverName} start${NC}"
    else
935
      echo -e "${GREEN_DARK}To start Adapter (if has)${NC}: ${adapterName} &${NC}"
936
      echo -e "${GREEN_DARK}To start ${productName}     ${NC}: ${serverName}${NC}"
H
hzcheng 已提交
937
    fi
938

939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
    if [ ! -z "$firstEp" ]; then
      tmpFqdn=${firstEp%%:*}
      substr=":"
      if [[ $firstEp =~ $substr ]]; then
        tmpPort=${firstEp#*:}
      else
        tmpPort=""
      fi
      if [[ "$tmpPort" != "" ]]; then
        echo -e "${GREEN_DARK}To access ${productName}    ${NC}: ${clientName} -h $tmpFqdn -P $tmpPort${GREEN_DARK} to login into cluster, then${NC}"
      else
        echo -e "${GREEN_DARK}To access ${productName}    ${NC}: ${clientName} -h $tmpFqdn${GREEN_DARK} to login into cluster, then${NC}"
      fi
      echo -e "${GREEN_DARK}execute ${NC}: create dnode 'newDnodeFQDN:port'; ${GREEN_DARK}to add this new node${NC}"
      echo
    elif [ ! -z "$serverFqdn" ]; then
      echo -e "${GREEN_DARK}To access ${productName}    ${NC}: ${clientName} -h $serverFqdn${GREEN_DARK} to login into ${productName} server${NC}"
      echo
    fi
H
hzcheng 已提交
958

959 960 961 962 963 964 965 966 967 968
    echo -e "\033[44;32;1m${productName} is installed successfully!${NC}"
    echo
  else # Only install client
    install_bin
    install_config
    echo
    echo -e "\033[44;32;1m${productName} client is installed successfully!${NC}"
  fi

  touch ~/.${historyFile}
969
  rm -rf $(tar -tf ${tarName} | grep -v "^\./$")
970
}
H
hzcheng 已提交
971 972

## ==============================Main program starts from here============================
H
[NONE]  
Hui Li 已提交
973
serverFqdn=$(hostname)
H
Hui Li 已提交
974
if [ "$verType" == "server" ]; then
975 976 977
  # Install server and client
  if [ -x ${bin_dir}/${serverName} ]; then
    update_flag=1
978
    updateProduct
979
  else
980
    installProduct
981
  fi
H
Hui Li 已提交
982
elif [ "$verType" == "client" ]; then
983 984 985 986
  interactiveFqdn=no
  # Only install client
  if [ -x ${bin_dir}/${clientName} ]; then
    update_flag=1
987
    updateProduct client
988
  else
989
    installProduct client
990
  fi
991
else
992
  echo "please input correct verType"
H
hzcheng 已提交
993
fi