brndnmtthws / conky

Light-weight system monitor for X, Wayland (sort of), and other things, too
https://conky.cc
GNU General Public License v3.0
7.21k stars 620 forks source link

[Bug]: variable evaluation doesn't respect conditionals; only results get occluded #1551

Open BETLOG opened 1 year ago

BETLOG commented 1 year ago

What happened?

I have written a single conky.conf to use on 3 different machines, two of which do not have a GPU, using ${if_match "${nodename}"=="betlognuc"} to prevent the relevant machines from trying to parse commands they cannot execute.

However they do anyway. Resulting in a slew of error messages.

I understand that conky parses the entire config, but surely it can be a little smarter about it.

Version

conky 1.18.0 compiled 2023-02-20 for Linux x86_64

Which OS/distro are you seeing the problem on?

Ubuntu

Conky config

conky.config = {
    alignment = 'top_right',
    background = true,
    border_width = 1,
    cpu_avg_samples = 2,
    default_color = 'white',
    default_outline_color = 'white',
    default_shade_color = '#888888',
      default_graph_height = 30,
--       default_graph_width 30,
    double_buffer = true,
    draw_borders = false,
    draw_graph_borders = true,
    draw_outline = false,
    draw_shades = false,
    extra_newline = false,
    font = 'DejaVu Sans Mono:size=20',
    gap_x = 10,
    gap_y = 80,
    minimum_height = 15,
    minimum_width = 300,
    net_avg_samples = 2,
    no_buffers = true,
    out_to_console = false,
    out_to_ncurses = false,
    out_to_stderr = false,
    out_to_x = true,
    own_window = true,
--     own_window_class = 'Conky',
--     own_window_type = 'desktop',
    own_window_type = 'normal',
    own_window_transparent = false,
--     own_window_transparent = true,
    own_window_hints = 'undecorated,sticky,skip_taskbar,skip_pager,below',
    show_graph_range = false,
    show_graph_scale = false,
    stippled_borders = 0,
    update_interval = 1.0,
    uppercase = false,
    use_spacer = 'none',
    use_xft = true,
}

conky.text = [[
${color green}${nodename}${color} \
${alignc}${color #44ffFF}CPU:${color}
load: ${color #FFFF00}${alignr}${cpu cpu0}%${color}
${cpugraph cpu0 30 00FF00 FF0000 -l}
temperature: ${color #FFFF00}${alignr}${exec "sensors|grep -E 'Package id 0:'|awk '{print $4}'|sed 's|+||;s|\..*$||'"}°C${color}
${execgraph "sensors|grep -E 'Package id 0:'|awk '{print $4}'|sed 's|+||;s|\..*$||'"}
memory: ${color #FFFF00}${alignr}${memperc}%${color}
${memgraph 30}
${if_match "${nodename}"!="betlognuc"}\
fan: ${color #FFFF00}${alignr}${exec "sensors|grep -E 'FAN.*RPM'|awk '{sum+=$3} END {print ((1200+1500)/0.02)/sum}'|sed 's|\..*$||'"}%${color}
${execgraph "sensors|grep -E 'FAN.*RPM'|awk '{sum+=$3} END {print ((1200+1500)/0.02)/sum}'"}\
${endif}
${if_match "${nodename}"=="betlogbeast"}\
${alignc}${color #44ffFF}GPU:${color}
load: ${color #FFFF00}${alignr}${exec "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits"}%${color}
${execgraph "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits"}
temperature: ${color #FFFF00}${alignr}${exec "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits"}C${color}
${execgraph "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits"}
memory: ${color #FFFF00}${alignr}${exec "nvidia-smi --query-gpu=utilization.memory --format=csv,noheader,nounits"}%${color}
${execgraph "nvidia-smi --query-gpu=utilization.memory --format=csv,noheader,nounits"}
fan: ${color #FFFF00}${alignr}${exec "nvidia-smi --query-gpu=fan.speed --format=csv,noheader,nounits"}%${color}
${execgraph "nvidia-smi --query-gpu=fan.speed --format=csv,noheader,nounits"}\
${endif}
${color #00AA7F}up${color}${alignc -20}${color #44ffFF}NET:${color}${alignr}${color #3D98E9}down${color}
${color #00AA7F}${upspeed}${color #3D98E9}${alignr}${downspeed}${color}
${if_match "${nodename}"=="betlogrick"}\
${upspeedgraph enp0s25 30,145 #00553F #00AA7F 0 }${alignr}${downspeedgraph enp0s25 30,145 #1F4C75 #3D98E9 0}\
${else}\
${upspeedgraph eno1 30,145 #00553F #00AA7F 0 }${alignr}${downspeedgraph eno1 30,145 #1F4C75 #3D98E9 0}\
${endif}
${color #00AA7F}read${color}${alignc -20}${color #44ffFF}I/O:${color}${alignr}${color #3D98E9}write${color}
${color #00AA7F}${diskio_read /dev/sda}${color}${alignr}${color #3D98E9}${diskio_write /dev/sda}${color}
${diskiograph_read /dev/sda 16,145 #00553F #00AA7F -l}${alignr}${diskiograph_write /dev/sda 16,145 #1F4C75 #3D98E9 -l}
${if_match "${nodename}"=="betlogbeast"}\
${color #00AA7F}${diskio_read /dev/sdb}${color}${alignr}${color #3D98E9}${diskio_write /dev/sdb}${color}
${diskiograph_read /dev/sdb 16,145 #00553F #00AA7F -l}${alignr}${diskiograph_write /dev/sdb 16,145 #1F4C75 #3D98E9 -l}
${color #00AA7F}${diskio_read /dev/sdc}${color}${alignr}${color #3D98E9}${diskio_write /dev/sdc}${color}
${diskiograph_read /dev/sdc 16,145 #00553F #00AA7F -l}${alignr}${diskiograph_write /dev/sdc 16,145 #1F4C75 #3D98E9 -l}
${color #00AA7F}${diskio_read /dev/sdd}${color}${alignr}${color #3D98E9}${diskio_write /dev/sdd}${color}
${diskiograph_read /dev/sdd 16,145 #00553F #00AA7F -l}${alignr}${diskiograph_write /dev/sdd 16,145 #1F4C75 #3D98E9 -l}
${color #00AA7F}${diskio_read /dev/sde}${color}${alignr}${color #3D98E9}${diskio_write /dev/sde}${color}
${diskiograph_read /dev/sde 16,145 #00553F #00AA7F -l}${alignr}${diskiograph_write /dev/sde 16,145 #1F4C75 #3D98E9 -l}
${color #00AA7F}${diskio_read /dev/sdf}${color}${alignr}${color #3D98E9}${diskio_write /dev/sdf}${color}
${diskiograph_read /dev/sdf 16,145 #00553F #00AA7F -l}${alignr}${diskiograph_write /dev/sdf 16,145 #1F4C75 #3D98E9 -l}\
${endif}
PROC:
${color grey}Name              PID     CPU%   MEM%
${color lightgrey} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color lightgrey} ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color lightgrey} ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
${color lightgrey} ${top name 4} ${top pid 4} ${top cpu 4} ${top mem 4}
]]

Stack trace

No response

Relevant log output

conky: desktop window (60005d) is subwindow of root window (1e4)
conky: window type - normal
conky: drawing to created window (0x8a00001)
conky: drawing to double buffer
conky: forked to background, pid is 288064

sh: 1: sh: 1: nvidia-smi: not found
nvidia-smi: not found
sh: 1: sh: 1: nvidia-smi: not found
sh: 1: sh: 1: nvidia-smi: not found
nvidia-smi: not found
nvidia-smi: not found
sh: 1: nvidia-smi: not found
sh: 1: nvidia-smi: not found
awk: cmd. line:1: fatal: division by zero attempted
awk: cmd. line:1: fatal: division by zero attempted
conky: reading exec value failed (perhaps it's not the correct format?)

.....repeats
Caellian commented 2 days ago

Happens because variables are evaluated before text content is built.

Fixing it requires handling obj->callbacks.iftest in extract_variable_text_internal similarly to how it's handled in generate_text_internal.

Caellian commented 2 days ago

dumb bot...