Many times I have found myself watching the various ‘debug’ commands like top / ps / mount / df or various log files like /var/log/messages or /var/log/automount.log when I thought something went wrong … or just takes little too long. I needed to open several terminal xterm(1) sessions (which is quite fast as I open them with [WIN]+[SPACE] and then [ENTER] but still …) and check what went wrong.

These actions tired my so I created a thing called Global Dashboard with all information I would ever need for such debugging.

You may want to check other articles in the FreeBSD Desktop series on the FreeBSD Desktop – Global Page where you will find links to all episodes of the series along with table of contents for each episode’s contents.

From all the commands that FreeBSD contains I have chosen these 12 ones:

mount -p

/var/log/automount.log

/var/log/messages

vmstat -i

usbconfig

ps axwww -o %cpu,rss,command

sockstat -l -4

top -m io -o total

gstat -p

df -g

pciconf -l

ifconfig

Make sure you have doas(1) installed and configured. The most basic way to do it is below. You will have to be in wheel group to make it work properly.

# pkg install doas # echo 'permit nopass :wheel as root' > /usr/local/etc/doas.conf # chmod 400 /usr/local/etc/doas.conf

Let me show you how it looks.

Here is the typical empty desktop with Global Dashboard disabled.

… and here is the Global Dashboard enabled.

For the sake of comfort I will use [Scroll Lock] key with xbindkeys to toggle between this ‘debug’ session on and off as I already use [Pause Break] key to Pause Any Application described in the Part 16 – Configuration – Pause Any Application episode of FreeBSD Desktop series.

Conky

We will have to use older (1.9) version of Conky as the current one (1.10/1.11) are broken for anything serious.

We will use portdowngrade tool for that job.

First, lets install needed packages.

# pkg install portdowngrade conky xbindkeys

Assuming that you have up to date FreeBSD Ports tree in the /usr/ports directory – we see that current Conky version in the Ports is 1.11.

% cd /usr/ports/sysutils/conky % cat distinfo TIMESTAMP = 1550919299 SHA256 (brndnmtthws-conky-v1.11.3_GH0.tar.gz) = 0140e749537d4d05bf33fbac436e54756faa26021e16f2bca418e9eeea724eb4 SIZE (brndnmtthws-conky-v1.11.3_GH0.tar.gz) = 2390099

We will now downgrade the Conky port to usable 1.9 version with portdowngrade utility. I already tried various Conky Port versions and the one that you are looking for is r419144 revision.

# cd /usr/ports/sysutils # mv conky conky-1.11 # portdowngrade sysutils/conky | grep -C 17 r419144 ------------------------------------------------------------------------ r422880 | madpilot | 2016-09-28 18:55:38 +0200 (Wed, 28 Sep 2016) | 13 lines - Update conky and conky-awesome to 1.10.4 - Take maintainership [1] - Options adapted to new version - Removed LUA option since it's a mandatoory requirement now - Use project own install target - Fix installation of lua helper libraries - Project moved to github - in conky-awesome, properly use OPTIONS_EXCLUDE PR: 212629 Submitted by: me Approved by: ntarmos@ceid.upatras.gr (former maintainer) [1] ------------------------------------------------------------------------ r419144 | pawel | 2016-07-26 20:57:23 +0200 (Tue, 26 Jul 2016) | 2 lines Fix typo ------------------------------------------------------------------------ r419142 | pawel | 2016-07-26 20:40:20 +0200 (Tue, 26 Jul 2016) | 8 lines - Add explicit IMPLIES between dependencies and simplify option handling [1] - Convert to USES=localbase - Switch some options helpers from LIB_DEPENDS to USE=xorg and USE=gnome PR: 210414 [1] (based on) Submitted by: elferdo@gmail.com Approved by: maintainer timeout ------------------------------------------------------------------------ r418767 | mat | 2016-07-19 13:04:13 +0200 (Tue, 19 Jul 2016) | 11 lines

We will now fetch the Conky port from r419144 revision – working 1.9 version.

# portdowngrade sysutils/conky r419144 A conky/files A conky/Makefile A conky/files/patch-configure A conky/files/patch-lua-cairo.pkg A conky/files/patch-src-conky.c A conky/files/patch-src-freebsd.c A conky/files/patch-src-freebsd.h A conky/files/patch-src-fs.c A conky/pkg-descr A conky/distinfo Checked out revision 419144. You should be done-- now cd into conky and you can run # make deinstall install clean Please note that portdowngrade no longer modifies the ports tree; the checked out port is at /usr/ports/sysutils/conky

Done. Let’s verify that its the version we need.

% pwd /usr/ports/sysutils % cat conky-1.11/distinfo TIMESTAMP = 1550919299 SHA256 (brndnmtthws-conky-v1.11.3_GH0.tar.gz) = 0140e749537d4d05bf33fbac436e54756faa26021e16f2bca418e9eeea724eb4 SIZE (brndnmtthws-conky-v1.11.3_GH0.tar.gz) = 2390099 % cat conky/distinfo SHA256 (conky-1.9.0.tar.bz2) = baf1b550f135fbfb53e5e286a33aadc03a667d63bf6c4d52ba7637366295bb6f SIZE (conky-1.9.0.tar.bz2) = 626555

Yup. We will now build a Conky 1.9 package (may be handy later).

# pwd /usr/ports/sysutils # cd conky # pwd /usr/ports/sysutils/conky # make package ===> conky-1.9.0_6 depends on file: /usr/local/sbin/pkg - found => conky-1.9.0.tar.bz2 doesn't seem to exist in /usr/ports/distfiles/. => Attempting to fetch https://downloads.sourceforge.net/project/conky/conky/1.9.0/conky-1.9.0.tar.bz2 conky-1.9.0.tar.bz2 100% of 611 kB 216 kBps 00m03s ===> Fetching all distfiles required by conky-1.9.0_6 for building ===> Extracting for conky-1.9.0_6 => SHA256 Checksum OK for conky-1.9.0.tar.bz2. ===> Patching for conky-1.9.0_6 ===> Applying FreeBSD patches for conky-1.9.0_6 ===> conky-1.9.0_6 depends on executable: gmake - found ===> conky-1.9.0_6 depends on package: libiconv>=1.14_11 - found ===> conky-1.9.0_6 depends on package: pkgconf>=1.3.0_1 - found ===> conky-1.9.0_6 depends on file: /usr/local/libdata/pkgconfig/x11.pc - found ===> conky-1.9.0_6 depends on file: /usr/local/libdata/pkgconfig/xext.pc - found ===> conky-1.9.0_6 depends on file: /usr/local/libdata/pkgconfig/xdamage.pc - found ===> conky-1.9.0_6 depends on file: /usr/local/libdata/pkgconfig/xfixes.pc - found ===> conky-1.9.0_6 depends on file: /usr/local/libdata/pkgconfig/xft.pc - found ===> Configuring for conky-1.9.0_6 ===> FreeBSD 10 autotools fix applied to /usr/ports/obj/usr/ports/sysutils/conky/work/conky-1.9.0/config.rpath (...) ====> Compressing man pages (compress-man) ===> Building package for conky-1.9.0_6 ===> Cleaning for conky-1.9.0_6

… but where is our package, its not in the /usr/ports/sysutils/conky directory. Its not in the /usr/ports/distfiles dir either.

As I use WRKDIRPREFIX=${PORTSDIR}/obj option in the /etc/make.conf file it should be somewhere in the /usr/ports/obj then.

% grep WRKDIRPREFIX /etc/make.conf WRKDIRPREFIX=${PORTSDIR}/obj

Let’s find(1) it.

% find /usr/ports/obj -name conky\*txz /usr/ports/obj/usr/ports/sysutils/conky/work/pkg/conky-1.9.0_6.txz

There. I will move it to /root directory to keep it.

# mv /usr/ports/obj/usr/ports/sysutils/conky/work/pkg/conky-1.9.0_6.txz /root

We will not clean up after the port/package building.

# make -C /usr/ports/sysutils/conky clean distclean ===> Cleaning for conky-1.9.0_6 #

We will now delete installed Conky 1.11 version and install our working 1.9 version.

# pkg delete conky Checking integrity... done (0 conflicting) Deinstallation has been requested for the following 1 packages (of 0 packages in the universe): Installed packages to be REMOVED: conky-1.11.3 Number of packages to be removed: 1 Proceed with deinstalling packages? [y/N]: y [1/1] Deinstalling conky-1.11.3... [1/1] Deleting files for conky-1.11.3: 100% # pkg add /root/conky-1.9.0_6.txz Installing conky-1.9.0_6... Extracting conky-1.9.0_6: 100%

Last check for the Conky version.

% conky --version Conky 1.9.0 compiled Tue Mar 19 12:55:55 CET 2019 for FreeBSD 11.2-RELEASE-p9 (amd64) Compiled in features: System config file: /usr/local/etc/conky/conky.conf Package library path: /usr/local/lib/conky X11: * Xdamage extension * XDBE (double buffer extension) * Xft * ARGB visual Music detection: General: * math * config-output

Great. We have needed Conky version.

By the way – did you thought how much work will it take to make the same on Debian or CentOS without the FreeBSD Ports infrastructure? 🙂

Xbindkeys

The only needed configuration in the ~/.xbindkeysrc is this one below – it may be different for your keyboard so make sure to ‘catch’ needed key event.

% cat ~/.xbindkeysrc # SCROLL LOCK | Scroll Lock "~/scripts/desktop-debug.sh" m:0x0 + c:78

If you need more information about how Xbindkeys work then read the FreeBSD Desktop – Part 9 – Key Components – Keyboard/Mouse Shortcuts episode.

Scripts and Configs

This is the ~/scripts/desktop-debug.sh script.

#! /bin/sh pgrep -q conky case ${?} in (0) killall -9 conky ;; (1) ~/scripts/__openbox_restart_conky.sh ;; esac

… and the ~/scripts/__openbox_restart_conky.sh script.

#! /bin/sh VERSION=1.9 PROFILE=T420s killall -9 conky nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.1 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.2 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.3 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.4 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.5 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.6 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.7 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.8 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.9 & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.a & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.b & nice -n 20 conky -c ~/.conkyrc.${VERSION}.${PROFILE}.LOG.c &

I use have several laptops so I need to distinguish which config files are used on which laptop, that is why I use PROFILE field – which is set to ThinkPad T420s in that example.

Here are the commands defined in these ~/.conkyrc.1.9.T420s.LOG.* files.

% grep exec ~/.conkyrc.1.9.T420s.LOG.* .conkyrc.1.9.T420s.LOG.1:${color #eeeeee}${exec mount -p | awk '{print $1, $2, $3}' | column -t} .conkyrc.1.9.T420s.LOG.2:${color #eeeeee}${exec tail -n 16 /var/log/automount.log} .conkyrc.1.9.T420s.LOG.3:${color #eeeeee}${exec grep -v -E 'pulseaudio|message repeated|null_update_chw|route failed:|send_packet: |gen6_gt_|feeder_|cdce0: (Su|Re)' /var/log/messages | tail -16} .conkyrc.1.9.T420s.LOG.4:${color #eeeeee}${exec vmstat -i} .conkyrc.1.9.T420s.LOG.5:${color #eeeeee}${exec doas usbconfig} .conkyrc.1.9.T420s.LOG.6:${color #eeeeee}${exec ps axwww -o %cpu,rss,command | head -1; ps axwww -o %cpu,rss,command | grep -v conky | grep -v '%CPU' | sort -n -r | head -15 } .conkyrc.1.9.T420s.LOG.7:${color #eeeeee}${exec sockstat -l -4 | cut -c 1-50} .conkyrc.1.9.T420s.LOG.8:${color #eeeeee}${exec top -m io -o total -b -s 1 -d 2 | grep -A 15 'PID USERNAME' | tail -n 16} .conkyrc.1.9.T420s.LOG.9:${color #eeeeee}${exec gstat -p -I 345678} .conkyrc.1.9.T420s.LOG.a:${color #eeeeee}${exec df -g | awk '{print $5,$6}' | column -t} .conkyrc.1.9.T420s.LOG.b:${color #eeeeee}${exec pciconf -l} .conkyrc.1.9.T420s.LOG.c:${color #eeeeee}${exec ifconfig -l -u | sed s/lo0//g | while read I; do ifconfig ${I}; done}

… and here is the diagram showing where these commands are placed.

I will use twelve (12) Conky configuration files for this purpose, each with one of the commands from above list.

a df(1) | b pciconf(8) | c ifconfig(8) ---------------+--------------------------+--------------------- 7 sockstat(1) | 8 top(1) | 9 gstat(8) ---------------+--------------------------+--------------------- 4 vmstat(8) | 5 usbconfig(8) | 6 ps(1) ---------------+--------------------------+--------------------- 1 mount(8) | 2 /var/log/automount.log | 3 /var/log/messages

Next are the full Conky configuration files.

~/.conkyrc.1.9.T420s.LOG.1

alignment bottom_left background yes gap_x 3 gap_y 3 minimum_size 279 193 maximum_width 280 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.1 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /sbin/mount -p ${color #eeeeee}${exec mount -p | awk '{print $1, $2, $3}' | column -t}

~/.conkyrc.1.9.T420s.LOG.2

alignment bottom_left background yes gap_x 288 gap_y 3 minimum_size 513 193 maximum_width 514 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.2 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /var/log/automount.log ${color #eeeeee}${exec tail -n 16 /var/log/automount.log}

~/.conkyrc.1.9.T420s.LOG.3

alignment bottom_left background yes gap_x 807 gap_y 3 minimum_size 789 193 maximum_width 790 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.3 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /var/log/messages ${color #eeeeee}${exec grep -v -E 'pulseaudio|message repeated|null_update_chw|route failed:|send_packet: |gen6_gt_|feeder_|cdce0: (Su|Re)' /var/log/messages | tail -16}

~/.conkyrc.1.9.T420s.LOG.4

alignment bottom_left background yes gap_x 3 gap_y 201 minimum_size 279 193 maximum_width 280 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.4 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /usr/bin/vmstat -i ${color #eeeeee}${exec vmstat -i}

~/.conkyrc.1.9.T420s.LOG.5

alignment bottom_left background yes gap_x 288 gap_y 201 minimum_size 513 193 maximum_width 514 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.5 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /usr/sbin/usbconfig ${color #eeeeee}${exec doas usbconfig}

~/.conkyrc.1.9.T420s.LOG.6

alignment bottom_left background yes gap_x 807 gap_y 201 minimum_size 789 193 maximum_width 790 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.6 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /bin/ps axwww -o %cpu,rss,command ${color #eeeeee}${exec ps axwww -o %cpu,rss,command | head -1; ps axwww -o %cpu,rss,command | grep -v conky | grep -v '%CPU' | sort -n -r | head -15 }

~/.conkyrc.1.9.T420s.LOG.7

alignment bottom_left background yes gap_x 3 gap_y 399 minimum_size 279 193 maximum_width 280 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.7 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /usr/bin/sockstat -l -4 ${color #eeeeee}${exec sockstat -l -4 | cut -c 1-50}

~/.conkyrc.1.9.T420s.LOG.8

alignment bottom_left background yes gap_x 288 gap_y 399 minimum_size 513 193 maximum_width 514 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.8 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /usr/bin/top -m io -o total ${color #eeeeee}${exec top -m io -o total -b -s 1 -d 2 | grep -A 15 'PID USERNAME' | tail -n 16}

~/.conkyrc.1.9.T420s.LOG.9

alignment bottom_left background yes gap_x 807 gap_y 399 minimum_size 789 193 maximum_width 790 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.9 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /usr/sbin/gstat -p -I 300000 ${color #eeeeee}${exec gstat -p -I 345678}

~/.conkyrc.1.9.T420s.LOG.a

alignment bottom_left background yes gap_x 3 gap_y 597 minimum_size 279 272 maximum_width 280 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.7 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /bin/df -g ${color #eeeeee}${exec df -g | awk '{print $5,$6}' | column -t}

~/.conkyrc.1.9.T420s.LOG.b

alignment bottom_left background yes gap_x 288 gap_y 597 minimum_size 513 272 maximum_width 514 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.8 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /usr/sbin/pciconf -l ${color #eeeeee}${exec pciconf -l}

~/.conkyrc.1.9.T420s.LOG.c

alignment bottom_left background yes gap_x 807 gap_y 597 minimum_size 789 272 maximum_width 790 double_buffer yes draw_outline no draw_shades no default_outline_color 444444 default_shade_color 444444 own_window yes own_window_class conky own_window_colour 222222 own_window_type override own_window_transparent no update_interval 2.9 use_xft yes xftfont ubuntu mono-10 border_inner_margin 0 border_outer_margin 0 border_width 2 TEXT ${color #ee0000}% /sbin/ifconfig wlan0/em0/tun0 ${color #eeeeee}${exec ifconfig -l -u | sed s/lo0//g | while read I; do ifconfig ${I}; done}

Thats a quite a lot configuration files but I think that this configuration done once will serve many many times in the future 🙂

These Conky configuration files are suited for the 1600×900 resolution, you will have to modify values of the gap_x / gap_y / minimum_size / maximum_width parameters to make it fit into other resolution.

Initially I wanted to write a script/generator for that, but lets face it – I will not be able to properly cover each possible resolution 🙂

UPDATE 2 – Latest Conky 1.11 Also Works

When I wrote this article I wrote that older Conky 1.9 version is needed (The conky-1.9.0_6 exactly which could be retrieved using portdowngrade sysutils/conky r419144 command).

Conky 1.10 introduced many bugs along with entirely new configuration format.

Latest Conky 1.11 (its conky-1.11.4_1 package on my box to be exact) works like a charm with Conky 1.9 configuration. It still has bug of NOT passing the mouse clicks to the desktop so of you want to make a left/middle/right click on the desktop aim on the place other then the Conky Dashboard space.

You can of course still follow the original article and fetch/build Conky with 1.9 version and have working left/middle/right mouse clicks on the desktop.

EOF