-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdisktemp
294 lines (259 loc) · 9.5 KB
/
disktemp
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
#!/bin/bash
# Script By Dachi Wolf
# GitHub https://github.com/SexyWerewolf
CONFIG_FILE="/etc/disktemp/disktemp.conf"
INTERVAL=15
COOLDOWN=120
LAST_NOTIFICATION_TIMES=()
# Function to check if the script is run as root
check_root() {
if [[ "$EUID" -ne 0 ]]; then
echo -e "\033[1;31m⚠️ This script must be run as root. Please use sudo.\033[0m"
exit 1
fi
}
print_header() {
clear
echo -e "\033[1;34m=======================================\033[0m"
echo -e "\033[1;34m 🌡️ Disk Temperature Monitoring \033[0m"
echo -e "\033[1;34m=======================================\033[0m"
echo
}
print_disks() {
print_header
echo -e "\033[1;32mCurrent disks being monitored:\033[0m"
echo
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
if [ ${#DISKS[@]} -eq 0 ]; then
echo -e "\033[1;31mNo disks are currently monitored.\033[0m"
else
for DISK in "${DISKS[@]}"; do
echo -e " - \033[1;36m$DISK\033[0m"
done
fi
else
echo -e "\033[1;31mConfiguration file not found.\033[0m"
fi
}
print_menu() {
print_header
echo -e "\033[1;33m1️⃣ Add Disk\033[0m"
echo -e "\033[1;33m2️⃣ Remove Disk\033[0m"
echo -e "\033[1;33m3️⃣ Set Global Critical Temperature\033[0m"
echo -e "\033[1;33m4️⃣ Set Critical Temperature Per Disk\033[0m"
echo -e "\033[1;33m5️⃣ Update Bot Token and Chat ID\033[0m"
echo -e "\033[1;33m6️⃣ Exit\033[0m"
echo
read -p "👉 Choose an option: " option
}
add_disk() {
ALL_DISKS=($(lsblk -dno NAME | grep -E '^sd|^nvme' | awk '{print "/dev/" $1}'))
print_disks
echo -e "\033[1;32mAvailable Disks:\033[0m"
local index=1
for disk in "${ALL_DISKS[@]}"; do
echo "$index. $disk"
((index++))
done
read -p "👉 Select disks to add (e.g., 1,2,3 or 0 for all disks): " selection
if [[ "$selection" == "0" ]]; then
DISKS=("${ALL_DISKS[@]}")
else
IFS=',' read -ra DISK_INDEXES <<< "$selection"
for index in "${DISK_INDEXES[@]}"; do
if [ "$index" -ge 1 ] && [ "$index" -le "${#ALL_DISKS[@]}" ]; then
DISKS+=("${ALL_DISKS[$((index-1))]}")
else
echo -e "\033[1;31m⚠️ Invalid index: $index\033[0m"
fi
done
fi
save_disks_config
}
remove_disk() {
print_disks
read -p "👉 Enter the disk to remove (e.g., /dev/nvme0n1): " disk_to_remove
if [[ " ${DISKS[@]} " =~ " $disk_to_remove " ]]; then
TEMP_DISKS=()
for disk in "${DISKS[@]}"; do
if [ "$disk" != "$disk_to_remove" ]; then
TEMP_DISKS+=("$disk")
else
echo -e "\033[1;31m🗑️ Removing: $disk\033[0m"
fi
done
DISKS=("${TEMP_DISKS[@]}")
save_disks_config
else
echo -e "\033[1;31m⚠️ Disk $disk_to_remove not found.\033[0m"
fi
}
set_global_critical_temperature() {
read -p "👉 Enter the new global critical temperature in °C: " NEW_CRITICAL_TEMP
if ! [[ "$NEW_CRITICAL_TEMP" =~ ^[0-9]+$ ]]; then
echo -e "\033[1;31m⚠️ Invalid temperature. Please enter a valid number.\033[0m"
return
fi
{
grep -v '^CRITICAL_TEMP=' "$CONFIG_FILE" | grep -v '^CRITICAL_TEMPS'
echo "CRITICAL_TEMP=$NEW_CRITICAL_TEMP"
} > "$CONFIG_FILE.temp"
mv "$CONFIG_FILE.temp" "$CONFIG_FILE"
}
set_critical_temperature_per_disk() {
print_disks
echo -e "\033[1;32mCritical Temperatures per Disk:\033[0m"
for i in "${!DISKS[@]}"; do
disk="${DISKS[$i]}"
current_temp=${CRITICAL_TEMPS[$i]}
echo "$disk: ${current_temp:-$CRITICAL_TEMP}°C"
done
echo
read -p "👉 Enter disk and critical temperature (e.g., /dev/sda 45): " disk temp
index=-1
for i in "${!DISKS[@]}"; do
if [ "${DISKS[$i]}" == "$disk" ]; then
index=$i
break
fi
done
if [ "$index" -ne -1 ]; then
if ! [[ "$temp" =~ ^[0-9]+$ ]]; then
echo -e "\033[1;31m⚠️ Invalid temperature. Please enter a valid number.\033[0m"
return
fi
CRITICAL_TEMPS[$index]=$temp
save_critical_temp_per_disk_config
else
echo -e "\033[1;31m⚠️ Disk $disk not found.\033[0m"
fi
}
update_bot_token_chat_id() {
echo -e "\033[1;36mExample Bot Token: 4839574812:AAFD39kkdpWt3ywyRZergyOLMaJhac60qc\033[0m"
read -p "👉 Enter the new Bot Token: " BOT_TOKEN
echo -e "\033[1;36mExample Chat ID: -123456666\033[0m"
read -p "👉 Enter the new Chat ID: " CHAT_ID
cp "$CONFIG_FILE" "$CONFIG_FILE.bak"
grep -v '^BOT_TOKEN=' "$CONFIG_FILE.bak" | grep -v '^CHAT_ID=' > "$CONFIG_FILE"
echo "BOT_TOKEN=$BOT_TOKEN" >> "$CONFIG_FILE"
echo "CHAT_ID=$CHAT_ID" >> "$CONFIG_FILE"
rm "$CONFIG_FILE.bak"
}
save_disks_config() {
{
grep -v '^DISKS=' "$CONFIG_FILE"
echo "DISKS=(${DISKS[*]})"
} > "$CONFIG_FILE.temp"
mv "$CONFIG_FILE.temp" "$CONFIG_FILE"
}
save_critical_temp_per_disk_config() {
{
grep -v '^CRITICAL_TEMPS' "$CONFIG_FILE"
for i in "${!DISKS[@]}"; do
echo "CRITICAL_TEMPS[$i]=${CRITICAL_TEMPS[$i]}"
done
} > "$CONFIG_FILE.temp"
mv "$CONFIG_FILE.temp" "$CONFIG_FILE"
}
send_telegram_notification() {
local disk=$1
local temp=$2
local message=$3
local url="https://api.telegram.org/bot${BOT_TOKEN}/sendMessage"
curl -s -X POST "$url" -d chat_id="$CHAT_ID" -d text="$message" -d parse_mode="Markdown" -d disable_web_page_preview="true" > /dev/null
}
print_disk_status() {
local disk=$1
local temp=$2
local critical_temp=$3
if [ -z "$temp" ]; then
echo -e "❓ \033[1;37mUnable to read temperature for $disk\033[0m"
elif [ "$temp" -ge "$critical_temp" ]; then
echo -e "🔥 \033[1;31mDisk $disk is at $temp°C (Critical: $critical_temp°C)\033[0m"
elif [ "$temp" -ge $((critical_temp - 5)) ]; then
echo -e "⚠️ \033[1;33mDisk $disk is at $temp°C (Approaching Critical: $critical_temp°C)\033[0m"
else
echo -e "✅ \033[1;32mDisk $disk is operating normally at $temp°C.\033[0m"
fi
}
run_monitoring() {
LAST_NOTIFICATION_TIMES=($(for ((i=0; i<${#DISKS[@]}; i++)); do echo 0; done))
if ! [[ "$CRITICAL_TEMP" =~ ^[0-9]+$ ]]; then
echo -e "\033[1;31mCritical temperature is not set correctly. Please set a valid number.\033[0m"
exit 1
fi
local initial_message="🌡️ *Disk Temperature Monitoring Started*
The disk temperature monitoring script has been initiated and is now monitoring the temperatures of the following disks:
${DISKS[*]}
The script will check the disk temperatures every $INTERVAL seconds."
send_telegram_notification "" "" "$initial_message"
while true; do
print_header
CURRENT_TIME=$(date +%s)
for i in "${!DISKS[@]}"; do
DISK="${DISKS[$i]}"
CURRENT_TEMP=$(smartctl -A "$DISK" | awk '/^194/ {print $10}' | tr -d '+')
if ! [[ "$CURRENT_TEMP" =~ ^[0-9]+$ ]]; then
print_disk_status "$DISK" "" ""
continue
fi
CRITICAL_TEMP_DISK=${CRITICAL_TEMPS[$i]:-$CRITICAL_TEMP}
print_disk_status "$DISK" "$CURRENT_TEMP" "$CRITICAL_TEMP_DISK"
if [ "$CURRENT_TEMP" -ge "$CRITICAL_TEMP_DISK" ]; then
if [ $(($CURRENT_TIME - ${LAST_NOTIFICATION_TIMES[$i]})) -ge $COOLDOWN ]; then
LAST_NOTIFICATION_TIMES[$i]=$CURRENT_TIME
send_telegram_notification "$DISK" "$CURRENT_TEMP" "⚠️ *Warning:* Disk $DISK has reached a critical temperature of $CURRENT_TEMP°C. Please take immediate action."
fi
fi
done
echo -e "\n\033[1;33mCooldown between notifications: $COOLDOWN seconds\033[0m"
echo -e "\033[1;33mInterval between temperature checks: $INTERVAL seconds\033[0m"
sleep "$INTERVAL"
done
}
print_creator_info() {
print_header
echo -e "\033[1;35m=======================================\033[0m"
echo -e "\033[1;35m Created by Dachi Wolf \033[0m"
echo -e "\033[1;35m Check out my work at: \033[0m"
echo -e "\033[1;35m \033[4mhttps://github.com/sexyWerewolf\033[0m"
echo -e "\033[1;35m=======================================\033[0m"
echo
}
case "$1" in
-conf)
check_root
mkdir -p /etc/disktemp
if [ ! -f "$CONFIG_FILE" ]; then
echo "Creating configuration file at $CONFIG_FILE"
{
echo "DISKS=()"
echo "CRITICAL_TEMP=75"
echo "CRITICAL_TEMPS=()"
echo "BOT_TOKEN="
echo "CHAT_ID="
} > "$CONFIG_FILE"
fi
while true; do
print_menu
case "$option" in
1) add_disk ;;
2) remove_disk ;;
3) set_global_critical_temperature ;;
4) set_critical_temperature_per_disk ;;
5) update_bot_token_chat_id ;;
6) print_creator_info; echo -e "\033[1;32m👋 Exiting...\033[0m"; exit 0 ;;
*) echo -e "\033[1;31m⚠️ Invalid option.\033[0m" ;;
esac
done
;;
*)
if [ ! -f "$CONFIG_FILE" ]; then
echo -e "\033[1;31m⚠️ Configuration file not found. Please run with -conf option to create one.\033[0m"
exit 1
fi
source "$CONFIG_FILE"
run_monitoring
;;
esac