#!/bin/sh set -e set -u fn_usage() { ( echo >&2 "" echo >&2 "USAGE" echo >&2 " dashd-hd-service-install [datadir] ['testnet']" echo >&2 "" echo >&2 "EXAMPLE" echo >&2 " dashd-hd-service-install /mnt/vol_slc1_100g/dashcore/" echo >&2 "" echo >&2 "NOTE" echo >&2 " If a directory matching '/mnt/*/dashcore/' is found," echo >&2 " it will be used automatically." echo >&2 "" ); } fn_datadir_help() { ( my_vol="${1:-}" my_user="$( id -n -u )" my_group="$( id -n -g )" echo >&2 "" echo >&2 "ERROR" echo >&2 " '${my_vol}' is not writable" echo >&2 "" echo >&2 "SOLUTION" echo >&2 " 1. Mount a large (50gb+) volume" echo >&2 "" echo >&2 " sudo mkdir -p /mnt/EXAMPLE" echo >&2 " sudo mount /dev/sdx1 /mnt/EXAMPLE" echo >&2 "" echo >&2 " 2. Create a 'dashcore' inside of it" echo >&2 "" echo >&2 " sudo mkdir -p '${my_vol}'" echo >&2 "" echo >&2 " 3. Make it writable to this user" echo >&2 "" echo >&2 " sudo chown -R '${my_user}':'${my_group}' '${my_vol}'" echo >&2 "" echo >&2 "" ); } fn_srv_install() { ( my_vol="${1:-}" my_netname="${2:-}" my_name='dashd' # both of these will get '/testnet3' suffixes with -testnet my_datadir="${my_vol}/_data" my_blocksdir="${my_vol}/_caches" if test -n "${my_netname}"; then if test "mainnet" = "${my_netname}"; then my_netname="" elif test "testnet" != "${my_netname}"; then fn_usage return 1 fi fi if ! test -d "${my_datadir}"; then mkdir "${my_datadir}" chmod 0700 "${my_datadir}" fi if ! test -d "${my_blocksdir}"; then mkdir -p "${my_blocksdir}" chmod 0700 "${my_blocksdir}" fi my_net_flag='' if test -n "${my_netname}"; then # ex: -testnet my_net_flag="-${my_netname}" # ex: dashd-testnet my_name="dashd-${my_netname}" fi my_system_args="" my_kernel="$( uname -s )" if test "Darwin" != "${my_kernel}"; then my_user="$( id -u -n )" my_system_args="--system --username ${my_user}" fi # shellcheck disable=SC2016,SC1090 echo 'sudo env PATH="$PATH"' \ "serviceman add ${my_system_args} --path \"\$PATH\" --name \"${my_name}\" --force --" \ "dashd " \ "${my_net_flag}" \ -usehd \ '-conf="$HOME/.dashcore/dash.conf"' \ '-settings="$HOME/.dashcore/settings.json"' \ '-walletdir="$HOME/.dashcore/wallets/"' \ "-datadir=\"${my_datadir}\"" \ "-blocksdir=\"${my_blocksdir}\"" if ! command -v serviceman > /dev/null; then echo "" echo "Installing 'serviceman'..." echo "" { curl -fsSL "${WEBI_HOST}/serviceman" | sh } > /dev/null # shellcheck disable=SC1090 . ~/.config/envman/PATH.env || true fi mkdir -p "$HOME/.dashcore/wallets/" chmod 0700 "$HOME/.dashcore/wallets/" mkdir -p "${my_datadir}" chmod 0700 "${my_datadir}" mkdir -p "${my_blocksdir}" chmod 0700 "${my_blocksdir}" cd "${my_vol}" || return 1 # leave options unquoted so they're interpreted separately # shellcheck disable=SC2086 sudo env PATH="${PATH}" \ serviceman add ${my_system_args} --path "${PATH}" --name "${my_name}" --force -- \ dashd \ ${my_net_flag} \ -usehd \ -conf="${HOME}/.dashcore/dash.conf" \ -settings="${HOME}/.dashcore/settings.json" \ -walletdir="${HOME}/.dashcore/wallets/" \ -datadir="${my_datadir}" \ -blocksdir="${my_blocksdir}" ); } main() { ( my_vol="${1:-}" my_netname="${2:-}" if test -z "${my_vol}"; then my_vol="$( ls -d /mnt/*/dashcore/ 2> /dev/null || true )" fi if test "help" = "${my_vol}" || test "--help" = "${my_vol}"; then fn_usage return 0 fi if test -z "${my_vol}"; then fn_usage return 1 fi if ! test -d "${my_vol}" || ! test -w "${my_vol}"; then fn_datadir_help "${my_vol}" return 1 fi fn_srv_install "${my_vol}" "${my_netname}" ); } main "${@:-}"