forked from vmorgunov/pipe-pop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpipe.sh
411 lines (348 loc) · 11.7 KB
/
pipe.sh
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
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
#!/bin/bash
# Check for the presence of curl and wget
install_package() {
PACKAGE=$1
if command -v apt >/dev/null 2>&1; then
sudo apt update
sudo apt install -y $PACKAGE
elif command -v yum >/dev/null 2>&1; then
sudo yum install -y $PACKAGE
else
echo "Unable to determine package manager. Please install $PACKAGE manually."
exit 1
fi
}
if ! command -v curl >/dev/null 2>&1; then
echo "curl not found. Will install..."
install_package curl
fi
if ! command -v wget >/dev/null 2>&1; then
echo "wget not found. Will install..."
install_package wget
fi
if ! command -v lsof >/dev/null 2>&1; then
echo "lsof not found. Will install..."
install_package lsof
fi
while true
do
DISK=150
RAM=8
LATEST_VERSION=$(. <(wget -qO- https://raw.githubusercontent.com/mgpwnz/pipe-pop/refs/heads/main/ver.sh))
LOG_VERSION=$(journalctl -n 100 -u pop -o cat | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | tail -1)
DEF_VERSION=0.2.2
#CURRENT_VERSION=$($HOME/opt/dcdn/pop --version | awk '/[0-9]+\.[0-9]+\.[0-9]+/ {for(i=1;i<=NF;i++) if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+$/) print $i}')
CURRENT_VERSION=$($HOME/opt/dcdn/pop --version 2>/dev/null | awk '/[0-9]+\.[0-9]+\.[0-9]+/ {for(i=1;i<=NF;i++) if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+$/) print $i}')
echo -e "\e[33mLatest node version $LATEST_VERSION\e[0m"
if [ ! -f "$HOME/opt/dcdn/pop" ]; then
echo -e "\e[31mNode is not installed!\e[0m"
else
echo -e "\e[92mInstalled node version $CURRENT_VERSION\e[0m"
fi
if systemctl is-active --quiet node_update.timer; then
echo -e "\e[32mAuto Update Active\e[0m"
else
echo -e "\e[31mAuto Update OFF\e[0m"
fi
# Function to stop and disable the pop service
stop_and_disable_pop() {
sudo systemctl stop pop
sudo systemctl disable pop
}
backup_node_info() {
# Create the backup directory if it doesn't exist
mkdir -p "$HOME/pipe_backup"
# Check if node_info.json exists in the backup directory before copying
if [ ! -f "$HOME/pipe_backup/node_info.json" ]; then
# Check if node_info.json exists in the original location
if [ -f "$HOME/opt/dcdn/node_info.json" ]; then
cp "$HOME/opt/dcdn/node_info.json" "$HOME/pipe_backup/node_info.json"
echo "Backup of node_info.json completed."
else
echo "node_info.json not found, skipping backup."
fi
else
echo "Backup already exists, skipping backup."
fi
}
delete_autoupdate(){
if [ -f "$HOME/opt/dcdn/update_node.sh" ]; then
rm $HOME/opt/dcdn/update_node.sh
sudo rm /etc/systemd/system/node_update.service
sudo rm /etc/systemd/system/node_update.timer
sudo systemctl daemon-reload
sudo systemctl disable node_update.timer
sudo systemctl stop node_update.timer
echo "Auto-update has been removed."
fi
}
port_check() {
local PORT=8003
if sudo lsof -i :$PORT >/dev/null 2>&1; then
echo "Error: Port $PORT is in use. Stopping installation."
exit 1
else
echo "Port $PORT is free. Continuing installation."
fi
}
restore_backup(){
if [ -f "$HOME/pipe_backup/node_info.json" ]; then
cp "$HOME/pipe_backup/node_info.json" "$HOME/opt/dcdn/node_info.json"
echo "Backup of node_info.json restored."
else
echo "Backup not found."
echo "Enter REF code (optional): "
read REF
if [ -n "$REF" ]; then
cd $HOME/opt/dcdn/
./pop --signup-by-referral-route "$REF"
fi
fi
}
download_and_prepare_pop() {
local max_retries=5
local attempt=0
local dest_dir="$HOME/opt/dcdn"
local dest_file="$dest_dir/pop"
sudo mkdir -p "$dest_dir/download_cache"
while (( attempt < max_retries )); do
sudo wget -O "$dest_file" "https://dl.pipecdn.app/v$DEF_VERSION/pop"
if [ -s "$dest_file" ]; then
sudo chmod +x "$dest_file"
echo "Download successful."
sudo rm -rf "$dest_dir/download_cache"
return 0
else
echo "Downloaded file is empty, retrying... ($((attempt + 1))/$max_retries)"
((attempt++))
fi
done
echo "Failed to download file after $max_retries attempts. Exiting."
sudo rm -rf "$dest_dir/download_cache"
exit 1
}
download_pop() {
local max_retries=5
local attempt=0
local dest_dir="$HOME/opt/dcdn"
local temp_file="$dest_dir/pop.tmp"
sudo mkdir -p "$dest_dir/download_cache"
while (( attempt < max_retries )); do
sudo wget -O "$temp_file" "https://dl.pipecdn.app/v$LOG_VERSION/pop"
if [ -s "$temp_file" ]; then
echo "Download successful."
break
else
echo "Downloaded file is empty, retrying... ($((attempt + 1))/$max_retries)"
((attempt++))
fi
done
if (( attempt == max_retries )); then
echo "Failed to download file after $max_retries attempts. Exiting."
sudo rm -rf "$dest_dir/download_cache"
exit 1
fi
}
find_prev_install() {
if [ -f "$HOME/opt/dcdn/pop" ]; then
echo -e "\e[31mNode is already installed\e[0m"
exit 1
else
echo -e "\e[92mInstall\e[0m"
fi
}
pre_update() {
if [ ! -f "$HOME/opt/dcdn/pop" ]; then
echo -e "\e[31mNode is not installed!\e[0m"
echo -e "\e[31mRun Install\e[0m"
exit 1
fi
}
# Menu
PS3='Select an action: '
options=("Install" "Update" "Logs" "Change System Requirements" "Status" "AutoUpdate" "Rem. AutoUpdate" "Ref" "Uninstall" "Exit")
select opt in "${options[@]}"; do
case $opt in
"Install")
cd $HOME
find_prev_install
port_check
echo "Enter Solana wallet: "
read PUB_KEY
echo "Find latest node version $LATEST_VERSION"
echo "Select version option:"
echo "1) Use default version ($DEF_VERSION)"
echo "2) Enter version manually"
read -rp "Enter choice (1 or 2): " choice
if [ "$choice" == "2" ]; then
read -rp "Enter version: " DEF_VERSION
fi
download_and_prepare_pop
if [ ! -L /usr/local/bin/pop ]; then
sudo ln -s "$HOME/opt/dcdn/pop" /usr/local/bin/pop
fi
restore_backup
sudo tee /etc/systemd/system/pop.service > /dev/null << EOF
[Unit]
Description=Pipe POP Node Service
After=network.target
Wants=network-online.target
[Service]
ExecStart=$HOME/opt/dcdn/pop --ram $RAM --pubKey $PUB_KEY --max-disk $DISK --cache-dir $HOME/opt/dcdn/download_cache
Restart=always
RestartSec=5
LimitNOFILE=65536
LimitNPROC=4096
StandardOutput=journal
StandardError=journal
SyslogIdentifier=dcdn-node
WorkingDirectory=$HOME/opt/dcdn
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable pop
sudo systemctl start pop
break
;;
"Update")
cd $HOME
pre_update
backup_node_info
# Get the current version of the program
#CURRENT_VERSION=$($HOME/opt/dcdn/pop --version | awk '{print $5}')
# Print the current and latest version for verification
echo "Current version: $CURRENT_VERSION"
echo "Log available version: $LOG_VERSION"
# Comparing versions
if [ "$CURRENT_VERSION" != "$LOG_VERSION" ]; then
echo "Update available! Updating version..."
# Downloading the new version as a temporary file
download_pop
# Stopping the service after successful download
sudo systemctl stop pop
# Replacing the old version with the new one
mv "$HOME/opt/dcdn/pop.tmp" "$HOME/opt/dcdn/pop"
sudo chmod +x "$HOME/opt/dcdn/pop"
sudo rm -rf "$HOME/opt/dcdn/download_cache"
# Update the symbolic link
sudo rm -f /usr/local/bin/pop
sudo ln -s "$HOME/opt/dcdn/pop" /usr/local/bin/pop
# Restart the service
sudo systemctl start pop
echo "Update completed successfully."
else
echo "You are already using the latest version: $CURRENT_VERSION"
fi
break
;;
"Logs")
pre_update
journalctl -n 100 -f -u pop -o cat
break
;;
"AutoUpdate")
# Check if the update script exists
pre_update
if [ ! -f "$HOME/opt/dcdn/update_node.sh" ]; then
echo "File $HOME/opt/dcdn/update_node.sh does not exist. Creating the update script..."
backup_node_info
# Download the update script
wget -O $HOME/opt/dcdn/update_node.sh https://raw.githubusercontent.com/mgpwnz/pipe-pop/refs/heads/main/update_node.sh
sudo chmod +x $HOME/opt/dcdn/update_node.sh
else
echo "File $HOME/opt/dcdn/update_node.sh already exists. Interrupting script execution."
exit 1
fi
# Create a systemd service for auto-update
sudo tee /etc/systemd/system/node_update.service > /dev/null << EOF
[Unit]
Description=Pipe POP Node Update Service
After=network.target
[Service]
ExecStart=$HOME/opt/dcdn/update_node.sh
Restart=on-failure
User=$USER
WorkingDirectory=$HOME
[Install]
WantedBy=multi-user.target
EOF
# Create a timer to execute the service
sudo tee /etc/systemd/system/node_update.timer > /dev/null << EOF
[Unit]
Description=Run Node Update Script Daily
[Timer]
OnBootSec=5min
OnUnitActiveSec=1d
Unit=node_update.service
[Install]
WantedBy=timers.target
EOF
# Restart systemd and activate the timer
sudo systemctl daemon-reload
sudo systemctl enable node_update.timer
sudo systemctl start node_update.timer
echo "Auto-update is configured and enabled."
break
;;
"Rem. AutoUpdate")
delete_autoupdate
break
;;
"Ref")
pre_update
cd $HOME/opt/dcdn/ && ./pop --gen-referral-route
cd $HOME
break
;;
"Status")
pre_update
cd $HOME/opt/dcdn/ && ./pop --status
cd $HOME
break
;;
"Change System Requirements")
pre_update
echo "Change System Requirements"
echo "Enter RAM: "
read NEW_RAM
echo "Enter STORAGE: "
read STORAGE
sudo sed -i "s/--ram=[^ ]*/--ram=$NEW_RAM/" /etc/systemd/system/pop.service
sudo sed -i "s/--max-disk [^ ]*/--max-disk $STORAGE/" /etc/systemd/system/pop.service
sudo systemctl daemon-reload
sudo systemctl restart pop
journalctl -n 100 -f -u pop -o cat
break
;;
"Uninstall")
pre_update
read -r -p "Wipe all DATA? [y/N] " response
case "$response" in
[yY][eE][sS]|[yY])
echo "Starting the Pipe POP Node removal process..."
stop_and_disable_pop
sudo rm -f /etc/systemd/system/pop.service
sudo systemctl daemon-reload
backup_node_info
delete_autoupdate
rm -rf $HOME/opt/dcdn
sudo rm -f /usr/local/bin/pop
sudo journalctl --vacuum-time=1s
echo "Removal completed successfully."
;;
*)
echo "Uninstallation canceled."
;;
esac
break
;;
"Exit")
exit
;;
*)
echo "Invalid option $REPLY"
;;
esac
done
done