set -e
+produce_memory() {
+ free | awk '$1 == "Mem:" {print $2, $3}'
+}
+
+produce_fan() {
+ fan_path="$1"
+ cat "$fan_path"
+}
+
+produce_temperature() {
+ thermal_zone="$1"
+ cat "/sys/class/thermal/thermal_zone${thermal_zone}/temp"
+}
+
+produce_loadavg() {
+ cat /proc/loadavg
+}
+
+produce_disk_io() {
+ disk_io_device="$1"
+ awk '
+ {
+ r = $3
+ w = $7
+ print w, r
+ }
+ ' "/sys/block/$disk_io_device/stat"
+}
+
produce_disk_space() {
disk_space_device="$1"
df --output=pcent "$disk_space_device" | awk 'NR == 2 {print $1}'
produce_net_addr_io() {
ip -s addr \
- | awk \
- -v prefixes_of_interfaces_to_show="$PREFIXES_OF_INTERFACES_TO_SHOW" \
- '
+ | awk '
BEGIN {
bytes_per_unit = 1024 * 1024
}
-v opt_mpd_song_max_chars=10 \
-v opt_prefixes_of_net_interfaces_to_show="$prefixes_of_net_interfaces_to_show" \
'
+ /^in:MEMORY/\
+ {
+ split_msg_parts()
+ db["memory_total"] = $1
+ db["memory_used"] = $2
+ }
+
+ /^in:FAN +status:/\
+ {
+ split_msg_parts()
+ db["fan_status"] = $2
+ }
+
+ /^in:FAN +speed:/\
+ {
+ split_msg_parts()
+ db["fan_speed"] = $2
+ }
+
+ /^in:FAN +level:/\
+ {
+ split_msg_parts()
+ db["fan_level"] = $2
+ }
+
+ /^in:TEMPERATURE/\
+ {
+ split_msg_parts()
+ db["temperature"] = $1
+ }
+
+ /^in:LOAD_AVG/\
+ {
+ split_msg_parts()
+ set_load_avg()
+ }
+
+ /^in:DISK_IO/\
+ {
+ split_msg_parts()
+ set_disk_io()
+ }
+
/^in:DISK_SPACE/\
{
split_msg_parts()
print make_bar()
}
+ function set_load_avg( sched) {
+ split($4, sched, "/")
+ db["load_avg_1min"] = $1
+ db["load_avg_5min"] = $2
+ db["load_avg_15min"] = $3
+ db["kern_sched_queue_runnable"] = sched[1]
+ db["kern_sched_queue_total"] = sched[2]
+ db["kern_sched_latest_pid"] = $5
+ }
+
+ function set_disk_io( curr_w, curr_r, prev_w, prev_r) {
+ curr_w = $1
+ curr_r = $2
+ prev_w = db["disk_io_curr_w"]
+ prev_r = db["disk_io_curr_r"]
+ db["disk_io_curr_w"] = curr_w
+ db["disk_io_curr_r"] = curr_r
+ db["disk_io_diff_w"] = curr_w - prev_w
+ db["disk_io_diff_r"] = curr_r - prev_r
+ }
function set_net_addr_io( \
interface, address, io_curr_w, io_curr_r, io_prev_w, io_prev_r\
}
function make_bar( position, bar, sep, i, j) {
- position[++i] = sprintf("D=[%s]", db["disk_space_used"])
+ position[++i] = make_status_mem()
+ position[++i] = make_status_cpu()
+ position[++i] = make_status_disk()
position[++i] = make_status_net()
position[++i] = sprintf("B=%s", db["bluetooth_power"])
position[++i] = sprintf("*%d%%", db["screen_brightness"])
return bar
}
+ function make_status_mem( total, used, percent, status) {
+ total = db["memory_total"]
+ used = db["memory_used"]
+ # To avoid division by zero
+ if (total && used) {
+ percent = round((used / total) * 100)
+ status = sprintf("%d%%", percent)
+ } else {
+ status = "__"
+ }
+ return sprintf("M=%s", status)
+ }
+
+ function make_status_cpu( load, temp, fan) {
+ load = db["load_avg_1min"]
+ temp = db["temperature"] / 1000
+ fan = db["fan_speed"]
+ return sprintf("C=[%4.2f %d°C %4drpm]", load, temp, fan)
+ }
+
+ function make_status_disk( bytes_per_sector, bytes_per_mb, w, r) {
+ bytes_per_sector = 512
+ bytes_per_mb = 1024 * 1024
+ w = (db["disk_io_diff_w"] * bytes_per_sector) / bytes_per_mb
+ r = (db["disk_io_diff_r"] * bytes_per_sector) / bytes_per_mb
+ return \
+ sprintf("D=[%s %0.3f▲ %0.3f▼]", db["disk_space_used"], w, r)
+ }
+
function make_status_net( \
out,
number_of_interfaces_to_show,
return sprintf("%s", symbol)
}
+ function round(n) {
+ return int(n + 0.5)
+ }
+
function debug(location, msg) {
if (opt_debug) {
print_error(location, msg)
screen_brightness_device_name='acpi_video0'
prefixes_of_net_interfaces_to_show='w' # comma-separated
disk_space_device='/'
+ disk_io_device='sda'
+ thermal_zone=0
+ fan_path='/proc/acpi/ibm/fan'
# User-overrides
long_options=''
long_options+=',screen-device:'
long_options+=',prefixes_of_net_interfaces_to_show:'
long_options+=',disk_space_device:'
+ long_options+=',thermal_zone:'
+ long_options+=',fan_path:'
OPTS=$(
getopt \
-o 'd' \
disk_space_device="$2"
shift 2
;;
+ --disk_io_device)
+ disk_io_device="$2"
+ shift 2
+ ;;
+ --thermal_zone)
+ thermal_zone="$2"
+ shift 2
+ ;;
+ --fan_path)
+ fan_path="$2"
+ shift 2
+ ;;
--)
shift
break
echo " weather_station_id|= $weather_station_id"
echo " prefixes_of_net_interfaces_to_show|= $prefixes_of_net_interfaces_to_show"
echo " disk_space_device|= $disk_space_device"
+ echo " disk_io_device|= $disk_io_device"
+ echo " thermal_zone|= $thermal_zone"
+ echo " fan_path|= $fan_path"
) | column -ts\|
echo ''
) >&2
cmd_produce_disk_space="produce_disk_space $disk_space_device"
+ cmd_produce_disk_io="produce_disk_io $disk_io_device"
+
+ cmd_produce_temperature="produce_temperature $thermal_zone"
+
+ cmd_produce_fan="produce_fan $fan_path"
+
# TODO: Redirect each worker's stderr to a dedicated log file
spawn produce_datetime "$pipe" 'in:DATE_TIME' 1
spawn "$cmd_produce_screen_brightness" "$pipe" 'in:SCREEN_BRIGHTNESS' 1
spawn produce_net_wifi_status "$pipe" 'in:NET_WIFI_STATUS' 5
spawn produce_net_addr_io "$pipe" 'in:NET_ADDR_IO' 1
spawn "$cmd_produce_disk_space" "$pipe" 'in:DISK_SPACE' 1
+ spawn "$cmd_produce_disk_io" "$pipe" 'in:DISK_IO' 1
+ spawn produce_loadavg "$pipe" 'in:LOAD_AVG' 1
+ spawn "$cmd_produce_temperature" "$pipe" 'in:TEMPERATURE' 1
+ spawn "$cmd_produce_fan" "$pipe" 'in:FAN' 1
+ spawn produce_memory "$pipe" 'in:MEMORY' 1
spawn produce_bar_req "$pipe" 'out:BAR' 1
consume \