Resurrect signal msg age in seconds
[khatus.git] / bin / khatus_show
CommitLineData
756b9d5a
SK
1#! /bin/bash
2
3set -e
4
5BIN=$HOME/bin
6STATUS_DIR=$HOME/var/run/status
7STATUS_FILE__WIFI=$STATUS_DIR/wifi
8STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF=$STATUS_DIR/notified_energy_bellow_half
9
14dc912f 10load=$(awk '{printf("%4.2f", $1)}' /proc/loadavg)
756b9d5a
SK
11
12fan=$(awk '/^speed:/ {printf "%4d", $2}' /proc/acpi/ibm/fan)
13
14cpu=$($BIN/khatus_cpu_usage_from_proc_since_last_check)
15
16memory=$(
17 free \
18 | awk '
19 function round(n) {return int(n + 0.5)}
20
21 $1 == "Mem:" {
22 total=$2;
23 used=$3;
24 cache=$6;
bd61022d 25 prev_file = "/home/siraaj/var/run/status/memory_used_percentage";
756b9d5a 26 curr = round(used / total * 100);
bd61022d
SK
27 getline prev < prev_file;
28 print curr > prev_file;
756b9d5a
SK
29 if (curr > prev) {
30 direction = ">";
31 } else if (curr < prev) {
32 direction = "<";
33 } else {
34 direction = "=";
35 }
36 printf("%s%d%%", direction, curr);
37 }')
38
39temp=$(awk 'NR == 1 {print $1 / 1000}' /sys/class/thermal/thermal_zone0/temp)
40
0da41dc2
SK
41disk_io=$(
42 awk '
43 {
44 bytes_per_sector = 512
45 bytes_per_unit = 1024 * 1024
46
47 curr_sectors_read = $3
48 curr_sectors_write = $7
49
50 prev_file_prefix = "/home/siraaj/var/run/status/disk_io"
51 prev_sectors_read_file = prev_file_prefix "_sectors_read"
52 prev_sectors_write_file = prev_file_prefix "_sectors_write"
53
54 getline prev_sectors_read < prev_sectors_read_file
55 getline prev_sectors_write < prev_sectors_write_file
56
57 diff_read_sectors = (curr_sectors_read - prev_sectors_read)
58 diff_write_sectors = (curr_sectors_write - prev_sectors_write)
59
60 diff_read_bytes = diff_read_sectors * bytes_per_sector
61 diff_write_bytes = diff_write_sectors * bytes_per_sector
62
63 diff_read = diff_read_bytes / bytes_per_unit
64 diff_write = diff_write_bytes / bytes_per_unit
65
66 print curr_sectors_read > prev_sectors_read_file
67 print curr_sectors_write > prev_sectors_write_file
68
69 printf("%0.3f▲ %0.3f▼\n", diff_write, diff_read);
70
71 }
72 ' /sys/block/dm-1/stat
73)
74
756b9d5a
SK
75disk=$(
76 df \
0da41dc2 77 | awk -v disk_io="$disk_io" '
756b9d5a
SK
78 function round(n) {return int(n + 0.5)}
79
80 $1 == "/dev/mapper/kubuntu--vg-root" {
0ca0fd63 81 curr_perc = $5; sub("%$", "", curr_perc);
0da41dc2 82 prev_perc_file = "/home/siraaj/var/run/status/disk_space_used";
0ca0fd63 83 getline prev_perc < prev_perc_file;
0ca0fd63
SK
84 print curr_perc > prev_perc_file;
85 if (curr_perc > prev_perc) {
756b9d5a 86 direction = ">";
0ca0fd63 87 } else if (curr_perc < prev_perc) {
756b9d5a
SK
88 direction = "<";
89 } else {
90 direction = "=";
91 }
0da41dc2 92 printf("%s[%d%% %s]", direction, curr_perc, disk_io);
756b9d5a
SK
93 }')
94
6b2a0f95
SK
95network=$(
96 awk -v wifi_conn=$(cat $STATUS_FILE__WIFI) '
f32c814f 97 BEGIN {
5d65d6cb 98 bytes_per_unit = 1024 * 1024
f32c814f
SK
99 }
100
62bb00b2 101 FILENAME == "/proc/net/dev" && NR > 2 {
f32c814f
SK
102 device = $1; sub(":$", "", device);
103 curr_read = $2;
104 curr_write = $10;
105
106 prev_file_prefix = "/home/siraaj/var/run/status/io_net_" device;
107 prev_read_file = prev_file_prefix "_read";
108 prev_write_file = prev_file_prefix "_write";
109
110 getline prev_read < prev_read_file;
111 getline prev_write < prev_write_file;
112
113 diff_read = (curr_read - prev_read ) / bytes_per_unit;
114 diff_write = (curr_write - prev_write) / bytes_per_unit;
115
116 print curr_read > prev_read_file;
117 print curr_write > prev_write_file;
118
62bb00b2
SK
119 io_rates[device] = sprintf("%0.3f▲ %0.3f▼", diff_write, diff_read);
120
121 next;
122 }
123
124 /^[a-zA-Z0-9]/ {
125 interface = $1
126 interfaces[interface_count++] = interface
127 }
128
129 /^ +inet addr:/ {
130 split($2, addr, ":")
131 ipaddr = addr[2]
132 ipaddrs[interface] = ipaddr
6b2a0f95
SK
133 }
134
135 END {
62bb00b2
SK
136 canvas = ""
137 i_last = length(ipaddrs)
138 for (interface in ipaddrs) {
139 #ipaddr = ipaddrs[interface]
140
141 if (++i_curr == i_last) {
142 sep = ""
143 } else {
144 sep = " |"
145 }
146
147 if (interface == "wlp3s0") {
148 curr = wifi_conn " " io_rates[interface]
149 } else if (interface == "lo") {
150 curr = interface " " io_rates[interface]
151 } else {
152 curr = "e" ++eth_count " " io_rates[interface]
153 }
154
155 canvas = canvas " " curr sep
1ca0626b 156 }
62bb00b2
SK
157 canvas = "[" canvas "]"
158 printf("%s", canvas)
f32c814f 159 }
62bb00b2
SK
160 ' \
161 /proc/net/dev \
162 <(ifconfig)
f32c814f
SK
163)
164
756b9d5a
SK
165energy=$(
166 upower -e \
167 | grep battery \
168 | xargs upower -i \
169 | awk '
170 /^ +percentage: +/ {percentage=$2}
171 /^ +state: +/ {state=$2}
172 END {
173 if (state == "discharging") {
174 direction_of_change = "<"
175 } else if (state == "charging") {
176 direction_of_change = ">"
177 } else {
178 direction_of_change = "="
179 };
180 printf("%s%s", direction_of_change, percentage)
181 }')
182
183datetime=$(date +'%a, %b %d, %H:%M:%S')
184
185#volume_amixer=$(
186# amixer get Master \
187# | tail -1 \
188# | awk '
189# {
190# level = $4;
191# sub("^\\[", "", level);
192# sub("\\]$", "", level);
193# print level;
194# }' \
195# )
196
197#volume_amixer=$(
198# amixer get Master \
199# | tail -n 1 \
200# | awk '{print $4}' \
201# | tr -d '[]'
202#)
203
204volume_pactl=$(
205 pactl list sinks \
206 | awk '
207 /^\tMute:/ {
208 printf("%s,", $0);
209 }
210 /^\tVolume:/ {
211 for (i=2; i<=NF; i++) printf(" %s", $i);
212 }' \
213 | awk -v RS=',' '
214 /^[ \t]*Mute:/ {mute = $2}
215 /^[ \t]*front-left:/ {left = $4}
216 /^[ \t]*front-right:/ {right = $4}
217 END {
218 if (mute == "yes") {
219 printf("x")
220 } else {
221 printf("%s %s", left, right)
222 }
223 }
224 '
225)
226
227volume="[$volume_pactl]"
228
756b9d5a
SK
229screen_brightness=$(
230 max=$(cat /sys/class/backlight/acpi_video0/max_brightness)
231 cur=$(cat /sys/class/backlight/acpi_video0/brightness)
232 awk -v max=$max -v cur=$cur 'BEGIN {printf("%d%%", cur/max*100)}'
233)
234
235#bluetooth_status=$(
236# grep '^status:' /proc/acpi/ibm/bluetooth \
237# | awk '
238# $2 == "disabled" {printf "off"}
239# $2 == "enabled" {printf "on"}
240# '
241#)
242
243bluetooth_power=$(
244 echo -e 'show \n quit' \
245 | bluetoothctl \
246 | awk '
247 /^Controller / {
248 controller = $2;
249 controllers[++ctrl_count] = controller;
250 }
251 /^\t[A-Z][A-Za-z]+:/ {
252 key = $1;
253 sub(":$", "", key);
254 val = $2;
255 for (i=3; i<=NF; i++) {
256 val = val " " $i};
257 data[controller, key] = val;
258 }
259 END {
260 # Using the 1st seen controller. Should we select specific instead?
261 power_status = data[controllers[1], "Powered"];
262 if (ctrl_count > 0) {
263 if (power_status == "no") {
264 power_status = "off"
265 } else if (power_status == "yes") {
266 power_status = "on"
267 } else {
268 printf("Unexpected bluetooth power status: %s\n", power_status)\
269 > "/dev/stderr";
270 power_status = "ERROR"
271 }
272 } else {
273 power_status = "off" # TODO: Perhaps use differentiated marker?
274 }
275 printf("%s", power_status);
276 }'
277)
278
279#touchpad_status=$(
280# xinput list-props 12 \
281# | awk '
282# /^\tDevice Enabled \([0-9]+\):/ {
283# status = $4;
284# printf("%s", status);
285# }'
286#)
287
288#color_off='\033[0m'
289#color_on_bg_gray='\033[m\033[40m'
290
291energy_direction=$(echo "$energy" | cut -b 1)
292energy_percentage=$(echo "$energy" | tr -d '<>=%')
293if [[ "$energy_direction" = '<' ]]
294then
295 if [[ $energy_percentage -le 5 ]]
296 then
297 DISPLAY=:0.0 notify-send \
298 -u critical \
299 "Energy CRITICALLY low: $energy" \
300 'CHARGE NOW!!! GO GO GO!!!'
301 elif [[ $energy_percentage -le 10 ]]
302 then
303 DISPLAY=:0.0 notify-send \
304 -u critical \
305 "Energy VERY low: $energy" \
306 'Plug it in ASAP.'
307 elif [[ $energy_percentage -le 15 ]]
308 then
309 DISPLAY=:0.0 notify-send \
310 -u critical \
311 "Energy low: $energy" \
312 'Get the charger.'
313 elif [[ $energy_percentage -le 50 ]]
314 then
315 if [[ ! -a "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF" ]]
316 then
317 DISPLAY=:0.0 notify-send \
318 -u normal \
319 "Energy bellow half: $energy" \
320 'Where is the charger?'
321 touch "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF"
322 fi
323 fi
324else
325 rm -f "$STATUS_FILE__ENERGY_NOTIFIED_BELLOW_HALF"
326fi
327
3de5d938 328weather=$(awk 'NR == 1 {printf("%d°F", $1)}' ~/var/run/metar-KJFK-decoded-temp-fahrenheit)
756b9d5a
SK
329
330signal_last_msg_age=$(
331 ls -lt --time-style=+%s $HOME/var/lib/signal/latest_message.json \
332 | awk -v now_seconds=$(date +%s) \
333 '{
334 mtime_seconds = $6;
335 seconds = now_seconds - mtime_seconds;
336 minutes = seconds / 60;
337 hours = minutes / 60;
338 days = hours / 24;
339 weeks = days / 7;
340 months = days / 30;
341 #fmt = "%.1f";
342 fmt = "%d";
8478ff6e 343 printf(fmt " s\n", seconds);
756b9d5a
SK
344 printf(fmt " m\n", minutes);
345 printf(fmt " h\n", hours);
346 printf(fmt " d\n", days);
347 printf(fmt " w\n", weeks);
348 printf(fmt " mo\n", months);
349 }' \
350 | awk '$1 >= 1' \
351 | sort -n -k 1 \
352 | head -1 \
353 | tr -d ' '
354)
355
a8c81faf
SK
356mpd_state=$(
357 echo 'status' \
358 | nc 127.0.0.1 6600 \
359 | awk '
360 {
361 status[$1] = $2
362 }
363
364 END {
365 state = status["state:"]
366 symbol = "-"
367 if (state == "play") {
368 symbol = "▶"
369 } else if (state == "pause") {
370 symbol = "❚❚"
371 } else if (state == "stop") {
372 symbol = "⬛"
373 }
374 printf("%s", symbol)
375 }
376 '
377)
378
a6f61387 379mpd_current=$(
94fb2cd7
SK
380 echo 'currentsong' \
381 | nc 127.0.0.1 6600 \
382 | awk -v max_chars=10 '
a6f61387
SK
383 /^OK/ {
384 next
385 }
386
387 {
388 key = $1
389 val = $2
390 for (i=3; i<=NF; i++) {val = val " " $i}
391 data[key] = val
392 }
393
394 END {
395 if (data["Name:"]) {
396 out = data["Name:"]
397 } else {
398 file = data["file:"]
399 last = split(file, parts, "/")
400 out = parts[last]
401 }
402 printf("%s", substr(out, 1, max_chars))
94fb2cd7
SK
403 }
404 '
405)
406
78fe905a
SK
407graphics_card=$(
408 nvidia-smi \
409 --format=csv,noheader,nounits \
410 --query-gpu=memory.total,memory.used,temperature.gpu \
411 | awk -F ',' '
412 {
413 mem_total = $1;
414 mem_used = $2;
415 temp = $3;
416 mem_used_percent = (100 * mem_used) / mem_total;
417 printf("[%d%% %dC]", mem_used_percent, temp);
418 }
419 '
420)
421
756b9d5a
SK
422echo \
423"\
424 E$energy\
1b554fca
SK
425 \
426 \
78fe905a
SK
427 G=$graphics_card\
428 \
429 \
756b9d5a 430 M$memory\
1b554fca
SK
431 \
432 \
756b9d5a 433 C=[$cpu ${temp}°C ${fan}rpm]\
1b554fca
SK
434 \
435 \
14dc912f
SK
436 L=$load\
437 \
438 \
a8f74eda 439 D$disk\
1b554fca
SK
440 \
441 \
6b2a0f95 442 N:$network\
1b554fca
SK
443 \
444 \
756b9d5a 445 B:$bluetooth_power\
1b554fca
SK
446 \
447 \
a8f74eda 448 S=$screen_brightness\
1b554fca
SK
449 \
450 \
a8f74eda
SK
451 V=$volume\
452 \
a6f61387 453 [$mpd_state $mpd_current]\
a8c81faf 454 \
4c935074
SK
455 $signal_last_msg_age\
456 \
756b9d5a
SK
457 $weather\
458 \
459 $datetime \
460"
This page took 0.065515 seconds and 4 git commands to generate.