-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathinstall-coin.sh
More file actions
executable file
·349 lines (319 loc) · 14 KB
/
install-coin.sh
File metadata and controls
executable file
·349 lines (319 loc) · 14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
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
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
#!/bin/bash
NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'
DATE_STAMP="$(date +%y-%m-%d-%s)"
NODE_IP=$(curl --silent ipinfo.io/ip)
## Only tested with linux-x64 & Ubuntu 16 & 18 - feel free to do a PR to improve compatibility ##
ARCH="linux-x64" #(Most desktop distributions like CentOS, Debian, Fedora, Ubuntu and derivatives) ##
#ARCH="linux-arm" #(Linux distributions running on ARM like Raspberry Pi)
#ARCH="rhel.6-x64" #(Red Hat Enterprise Linux)
OS_VER="Ubuntu*"
usage() { echo "Usage: $0 [-f coin name] [-u rpc username] [-p rpc password] [-n (m/t/u) main, test or upgrade] [-b github branch/tags]" 1>&2; exit 1; }
while getopts ":f:u:p:n:b:" option; do
case "${option}" in
f) FORK=${OPTARG};;
u) RPCUSER=${OPTARG};;
p) RPCPASS=${OPTARG};;
n) NET=${OPTARG};;
b) BRANCH=${OPTARG};;
*) usage ;;
esac
done
shift "$((OPTIND-1))"
source /tmp/config-${FORK}.sh
if [${BRANCH} = ""]; then
BRANCH="master";
fi
SCRIPT_LOGFILE="/tmp/${NODE_USER}_${DATE_STAMP}_output.log"
function check_root() {
if [ "$(id -u)" != "0" ]; then
echo -e "${RED}* Sorry, this script needs to be run as root. Do \"sudo su root\" and then re-run this script${NONE}"
exit 1
echo -e "${NONE}${GREEN}* All Good!${NONE}";
fi
}
function create_user() {
echo
echo "* Checking for user & add if required. Please wait..."
# our new mnode unpriv user acc is added
if id "${NODE_USER}" >/dev/null 2>&1; then
echo "user exists already, do nothing"
else
echo -e "${NONE}${GREEN}* Adding new system user ${NODE_USER}${NONE}"
sudo adduser --disabled-password --gecos "" ${NODE_USER} &>> ${SCRIPT_LOGFILE}
sudo echo -e "${NODE_USER} ALL=(ALL) NOPASSWD:ALL" &>> /etc/sudoers.d/90-cloud-init-users
fi
echo -e "${NONE}${GREEN}* Done${NONE}";
}
function set_permissions() {
chown -R ${NODE_USER}:${NODE_USER} ${COINSTARTUP} ${COINDLOC} &>> ${SCRIPT_LOGFILE}
# make group permissions same as user, so vps-user can be added to node group
chmod -R g=u ${COINSTARTUP} ${COINDLOC} ${COINSERVICELOC} &>> ${SCRIPT_LOGFILE}
}
function checkOSVersion() {
echo
echo "* Checking OS version..."
if [[ `cat /etc/issue.net` == ${OS_VER} ]]; then
echo -e "${GREEN}* You are running `cat /etc/issue.net` . Setup will continue.${NONE}";
else
echo -e "${RED}* You are not running ${OS_VER}. You are running `cat /etc/issue.net` ${NONE}";
echo && echo "Installation cancelled" && echo;
exit;
fi
}
function updateAndUpgrade() {
echo
echo "* Running update and upgrade. Please wait..."
sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq -y &>> ${SCRIPT_LOGFILE}
sudo DEBIAN_FRONTEND=noninteractive apt-get upgrade -y -qq &>> ${SCRIPT_LOGFILE}
sudo DEBIAN_FRONTEND=noninteractive apt-get autoremove -y -qq &>> ${SCRIPT_LOGFILE}
echo -e "${GREEN}* Done${NONE}";
}
function setupSwap() {
#check if swap is available
echo
echo "* Creating Swap File. Please wait..."
if [ $(free | awk '/^Swap:/ {exit !$2}') ] || [ ! -f "/var/node_swap.img" ];then
echo -e "${GREEN}* No proper swap, creating it.${NONE}";
# needed because ant servers are ants
sudo rm -f /var/node_swap.img &>> ${SCRIPT_LOGFILE}
sudo dd if=/dev/zero of=/var/node_swap.img bs=1024k count=${SWAPSIZE} &>> ${SCRIPT_LOGFILE}
sudo chmod 0600 /var/node_swap.img &>> ${SCRIPT_LOGFILE}
sudo mkswap /var/node_swap.img &>> ${SCRIPT_LOGFILE}
sudo swapon /var/node_swap.img &>> ${SCRIPT_LOGFILE}
echo '/var/node_swap.img none swap sw 0 0' | sudo tee -a /etc/fstab &>> ${SCRIPT_LOGFILE}
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE}
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf &>> ${SCRIPT_LOGFILE}
else
echo -e "${GREEN}* All good, we have a swap.${NONE}";
fi
}
function installFail2Ban() {
echo
echo -e "* Installing fail2ban. Please wait..."
sudo apt-get -y install fail2ban &>> ${SCRIPT_LOGFILE}
sudo systemctl enable fail2ban &>> ${SCRIPT_LOGFILE}
sudo systemctl start fail2ban &>> ${SCRIPT_LOGFILE}
# Add Fail2Ban memory hack if needed
if ! grep -q "ulimit -s 256" /etc/default/fail2ban; then
echo "ulimit -s 256" | sudo tee -a /etc/default/fail2ban &>> ${SCRIPT_LOGFILE}
sudo systemctl restart fail2ban &>> ${SCRIPT_LOGFILE}
fi
echo -e "${NONE}${GREEN}* Done${NONE}";
}
function installFirewall() {
echo
echo -e "* Installing UFW. Please wait..."
sudo apt-get -y install ufw &>> ${SCRIPT_LOGFILE}
sudo ufw allow OpenSSH &>> ${SCRIPT_LOGFILE}
sudo ufw allow $COINPORT/tcp &>> ${SCRIPT_LOGFILE}
sudo ufw allow $COINRPCPORT/tcp &>> ${SCRIPT_LOGFILE}
if [ "${DNSPORT}" != "" ] ; then
sudo ufw allow ${DNSPORT}/tcp &>> ${SCRIPT_LOGFILE}
sudo ufw allow ${DNSPORT}/udp &>> ${SCRIPT_LOGFILE}
fi
echo "y" | sudo ufw enable &>> ${SCRIPT_LOGFILE}
echo -e "${NONE}${GREEN}* Done${NONE}";
}
function installDependencies() {
echo
echo -e "* Installing dependencies. Please wait..."
sudo timedatectl set-ntp no &>> ${SCRIPT_LOGFILE}
sudo apt-get install git unzip ntp nano wget curl make gcc software-properties-common -y &>> ${SCRIPT_LOGFILE}
if [[ -r /etc/os-release ]]; then
. /etc/os-release
if [[ "${VERSION_ID}" = "16.04" ]]; then
wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
sudo dpkg -i packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
sudo apt-get install apt-transport-https -y &>> ${SCRIPT_LOGFILE}
sudo apt-get update -y &>> ${SCRIPT_LOGFILE}
sudo apt-get install dotnet-sdk-2.2 -y &>> ${SCRIPT_LOGFILE}
echo -e "${NONE}${GREEN}* Done${NONE}";
fi
if [[ "${VERSION_ID}" = "18.04" ]]; then
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
sudo dpkg -i packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
sudo add-apt-repository universe -y &>> ${SCRIPT_LOGFILE}
sudo apt-get install apt-transport-https -y &>> ${SCRIPT_LOGFILE}
sudo apt-get update -y &>> ${SCRIPT_LOGFILE}
sudo apt-get install dotnet-sdk-2.2 -y &>> ${SCRIPT_LOGFILE}
echo -e "${NONE}${GREEN}* Done${NONE}";
fi
if [[ "${VERSION_ID}" = "19.04" ]]; then
wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
sudo dpkg -i packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
sudo apt-get install apt-transport-https -y &>> ${SCRIPT_LOGFILE}
sudo apt-get update -y &>> ${SCRIPT_LOGFILE}
sudo apt-get install dotnet-sdk-2.2 -y &>> ${SCRIPT_LOGFILE}
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl1.0/libssl1.0.0_1.0.2n-1ubuntu6_amd64.deb &>> ${SCRIPT_LOGFILE}
sudo dpkg -i libssl1.0.0_1.0.2n-1ubuntu6_amd64.deb &>> ${SCRIPT_LOGFILE}
echo -e "${NONE}${GREEN}* Done${NONE}";
fi
if [[ "${VERSION_ID}" = "20.04" ]]; then
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
dpkg -i packages-microsoft-prod.deb &>> ${SCRIPT_LOGFILE}
apt-get update -y &>> ${SCRIPT_LOGFILE}
apt-get install apt-transport-https -y &>> ${SCRIPT_LOGFILE}
apt-get update -y &>> ${SCRIPT_LOGFILE}
apt-get install dotnet-sdk-2.2 -y &>> ${SCRIPT_LOGFILE}
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl1.0/libssl1.0.0_1.0.2n-1ubuntu6_amd64.deb &>> ${SCRIPT_LOGFILE}
dpkg -i libssl1.0.0_1.0.2n-1ubuntu6_amd64.deb &>> ${SCRIPT_LOGFILE}
echo -e "${NONE}${GREEN}* Done${NONE}";
fi
else
echo -e "${NONE}${RED}* Version: ${VERSION_ID} not supported.${NONE}";
fi
}
function compileWallet() {
echo
echo -e "* Compiling wallet. Please wait, this might take a while to complete..."
cd /home/${NODE_USER}/
git clone --recurse-submodules --branch=${BRANCH} ${COINGITHUB} code &>> ${SCRIPT_LOGFILE}
cd /home/${NODE_USER}/code
git submodule update --init --recursive &>> ${SCRIPT_LOGFILE}
cd ${COINDSRC}
dotnet publish -c ${CONF} -r ${ARCH} -v m -o ${COINDLOC} &>> ${SCRIPT_LOGFILE} ### compile & publish code
# Workaround to install FodyNlogAdapter
wget -P /home/${NODE_USER}/code https://globalcdn.nuget.org/packages/stratis.fodynlogadapter.3.0.4.1.nupkg &>> ${SCRIPT_LOGFILE}
unzip -qq -o /home/${NODE_USER}/code/stratis.fodynlogadapter.3.0.4.1.nupkg -d /home/${NODE_USER}/code &>> ${SCRIPT_LOGFILE}
mv /home/${NODE_USER}/code/lib/netstandard2.0/* ${COINDLOC} &>> ${SCRIPT_LOGFILE}
rm -rf /home/${NODE_USER}/code &>> ${SCRIPT_LOGFILE} ### Remove source
echo -e "${NONE}${GREEN}* Done${NONE}";
}
function installWallet() {
echo
echo -e "* Installing wallet. Please wait..."
cd /home/${NODE_USER}/
echo -e "#!/bin/bash\nexport DOTNET_CLI_TELEMETRY_OPTOUT=1\nexport LANG=en_US.UTF-8\nif [ -f /var/secure/credentials.sh ]; then\nsource /var/secure/credentials.sh\nstakeparams=\"-stake -walletname=\${STAKINGNAME} -walletpassword=\${STAKINGPASSWORD}\"\nfi\ncd $COINDLOC\n$COINRUNCMD" > ${COINSTARTUP}
echo -e "[Unit]\nDescription=${COINDAEMON}\nAfter=network-online.target\n\n[Service]\nType=simple\nUser=${NODE_USER}\nGroup=${NODE_USER}\nExecStart=${COINSTARTUP}\nTimeoutStopSec=180\nExecStop=/bin/kill -2 $MAINPID\nRestart=always\nRestartSec=5\nPrivateTmp=true\nTimeoutStopSec=60s\nTimeoutStartSec=5s\nStartLimitInterval=120s\nStartLimitBurst=15\n\n[Install]\nWantedBy=multi-user.target" >${COINSERVICENAME}.service
sudo mv $COINSERVICENAME.service ${COINSERVICELOC} &>> ${SCRIPT_LOGFILE}
sudo chmod 777 ${COINSTARTUP} &>> ${SCRIPT_LOGFILE}
sudo systemctl --system daemon-reload &>> ${SCRIPT_LOGFILE}
sudo systemctl enable ${COINSERVICENAME} &>> ${SCRIPT_LOGFILE}
echo -e "${NONE}${GREEN}* Done${NONE}";
}
function startWallet() {
echo
echo -e "* Starting wallet daemon...${COINSERVICENAME}"
sudo service ${COINSERVICENAME} start &>> ${SCRIPT_LOGFILE}
sleep 2
echo -e "${GREEN}* Done${NONE}";
}
function stopWallet() {
echo
echo -e "* Stopping wallet daemon...${COINSERVICENAME}"
sudo service ${COINSERVICENAME} stop &>> ${SCRIPT_LOGFILE}
sleep 2
echo -e "${GREEN}* Done${NONE}";
}
function installUnattendedUpgrades() {
echo
echo "* Installing Unattended Upgrades..."
sudo apt install unattended-upgrades -y &>> ${SCRIPT_LOGFILE}
sleep 3
sudo sh -c 'echo "Unattended-Upgrade::Allowed-Origins {" >> /etc/apt/apt.conf.d/50unattended-upgrades'
sudo sh -c 'echo " "${distro_id}:${distro_codename}";" >> /etc/apt/apt.conf.d/50unattended-upgrades'
sudo sh -c 'echo " "${distro_id}:${distro_codename}-security";" >> /etc/apt/apt.conf.d/50unattended-upgrades'
sudo sh -c 'echo "APT::Periodic::AutocleanInterval "7";" >> /etc/apt/apt.conf.d/20auto-upgrades'
sudo sh -c 'echo "APT::Periodic::Unattended-Upgrade "1";" >> /etc/apt/apt.conf.d/20auto-upgrades'
cat /etc/apt/apt.conf.d/20auto-upgrades &>> ${SCRIPT_LOGFILE}
echo -e "${GREEN}* Done${NONE}";
}
function displayServiceStatus() {
echo
echo
on="${GREEN}ACTIVE${NONE}"
off="${RED}OFFLINE${NONE}"
if systemctl is-active --quiet ${COINSERVICENAME}; then echo -e "Service: ${on}"; else echo -e "Service: ${off}"; fi
}
clear
cd
echo && echo
echo -e "${PURPLE}**********************************************************************${NONE}"
echo -e "${PURPLE}* This script will install and configure your full node. *${NONE}"
echo -e "${PURPLE}**********************************************************************${NONE}"
echo -e "${BOLD}"
check_root
echo -e "${BOLD}"
if [[ "$NET" =~ ^([mM])+$ ]]; then
setMainVars
setGeneralVars
echo -e "${BOLD} The log file can be monitored here: ${SCRIPT_LOGFILE}${NONE}"
echo -e "${BOLD}"
checkOSVersion
updateAndUpgrade
create_user
setupSwap
installFail2Ban
installFirewall
installDependencies
compileWallet
installWallet
installUnattendedUpgrades
startWallet
set_permissions
displayServiceStatus
echo
echo -e "${GREEN} Installation complete. Check service with: journalctl -f -u ${COINSERVICENAME} ${NONE}"
echo -e "${GREEN} thecrypt0hunter(2019)${NONE}"
else
if [[ "$NET" =~ ^([tT])+$ ]]; then
setTestVars
setGeneralVars
echo -e "${BOLD} The log file can be monitored here: ${SCRIPT_LOGFILE}${NONE}"
echo -e "${BOLD}"
checkOSVersion
updateAndUpgrade
create_user
setupSwap
installFail2Ban
installFirewall
installDependencies
compileWallet
installWallet
installUnattendedUpgrades
startWallet
set_permissions
displayServiceStatus
echo
echo -e "${GREEN} Installation complete. Check service with: journalctl -f -u ${COINSERVICENAME} ${NONE}"
echo -e "${GREEN} thecrypt0hunter(2019)${NONE}"
else
if [[ "$NET" =~ ^([uU])+$ ]]; then
check_root
##TODO: Test for servicefile and only upgrade as required
##TODO: Setup for testnet - test if file exists
##[ ! -f ${COINSERVICELOC}$COINSERVICENAME.service ] << Test for service file
#Stop Test Service
setTestVars
setGeneralVars
stopWallet
updateAndUpgrade
compileWallet
#Stop Main Service
setMainVars
setGeneralVars
stopWallet
compileWallet
#Start Test Service
setTestVars
setGeneralVars
startWallet
#Start Main Service
setMainVars
setGeneralVars
startWallet
echo -e "${GREEN} thecrypt0hunter 2019${NONE}"
else
echo && echo -e "${RED} Installation cancelled! ${NONE}" && echo
fi
fi
fi
cd ~