Патчим conky, исправляем баг работы с apcupsd

Я конечно все понимаю, философия Arhc'a такая, что все должно работать как задумывал разработчик, но если проект мягко говоря заброшен, а очень нужная фичя в программе есть, но не работает, вот тут то к нам на помощь и приходят патчи.


Многие насмехаются над пользователями conky, за излишество выводимых данных, и в частности за версию ядра, лично я в этом ничего такого не вижу, ядро обновляется как минимум раз в неделю, и бывает забываешь какая там версия… Но сейчас не об этом, установив conky и скопировав старый конфиг из debian, я не увидел не температуры видеокарты, не процессора… да даже в статусе бесперебойника стояло N/A хотя служба apcusbd была настроена и прекрасно работала. Я стал разбираться, выяснилось что это древний баг коньков, а патч есть в пакете debian'a. Погнали, заставим эту сучку работать!

Обновил статью но процесс сборки не трогал, я давно уже использую conky-nvidia, apcusb давно работает из коробки.

Я особо не стал заморачиваться и воспользовался системой PKGBUILD Arhc'a.
Я взял готовый PKBUILD из [https://aur.archlinux.org/packages/conky-lua-nv/] и немножко его подправил.
# Maintainer: Jon Wilson <bugs@pandorica.net>
# Contributor: Spyros Stathopoulos <foucault.online[at]gmail[dot]com>
# Contributor: Andrwe Lord Weber <lord-weber-andrwe [at] andrwe [dot] org>
# Contributor: Giovanni Scafora <giovanni@archlinux.org>
# Contributor: James Rayner <james@archlinux.org>
# Contributor: Partha Chowdhury <kira.laucas@gmail.com>

pkgname=conky-nv
_pkgname=conky
pkgver=1.9.0
pkgrel=6
pkgdesc="An advanced system monitor for X based on torsmo with lua and nvidia enabled"
arch=('i686' 'x86_64')
url="http://conky.sourceforge.net/"
license=('custom')
replaces=('torsmo' 'conky')
conflicts=('conky')
provides=('conky')
depends=('alsa-lib' 'libxml2' 'curl' 'cairo' 'libxft' 'glib2' 'libxdamage' 'imlib2' )
makedepends=('pkgconfig' 'libxnvctrl')
optdepends=('nvidia: for GT4xx and newer GPUs',
  'nvidia-340xx: for G8x, G9x, GT2xx GPUS',
  'nvidia-304xx: for GeForce 6/7 GPUs')
backup=(etc/conky/conky.conf etc/conky/conky_no_x11.conf)
source=(http://downloads.sourceforge.net/project/${_pkgname}/${_pkgname}/${pkgver}/${_pkgname}-${pkgver}.tar.bz2 apcupsd.patch 3616.patch)
md5sums=('d3de615f43aadc98d555e05ad9e902c2'
'7f25a356d8944c82bebc1c85c88c4e27'
'8c744eb18015df9d06b12ec81a45ee76')
install="conky-nv.install"

build() {
  cd ${srcdir}/${_pkgname}-${pkgver}
  pwd
  patch -p1 < ../apcupsd.patch
  patch -p1 < ../3616.patch

  sed -i '/#include <curl\/types.h>/d' ${srcdir}/${_pkgname}-${pkgver}/src/ccurl_thread.c
  ./configure --prefix=/usr \
              --sysconfdir=/etc \
              --enable-ibm \
              --enable-imlib2 \
              --enable-ibm \
              --enable-nvidia
  make
}

package() {
  cd ${srcdir}/${_pkgname}-${pkgver}
  make DESTDIR=${pkgdir} install
  install -D -m644 COPYING ${pkgdir}/usr/share/licenses/${_pkgname}/LICENSE
  install -D -m644 extras/vim/syntax/conkyrc.vim "${pkgdir}"/usr/share/vim/vimfiles/syntax/conkyrc.vim
  install -D -m644 extras/vim/ftdetect/conkyrc.vim "${pkgdir}"/usr/share/vim/vimfiles/ftdetect/conkyrc.vim
}

# vim:ts=2:et:sw=2
Выкладываю патчи отдельно [3616.patch] [apcupsd.patch]
Уже собранный пакет [conky-nv-1.9.0-6-x86_64.pkg.tar.xz]
И если у вас есть желание собрать самим скачиваем [conky-nv.tar.gz],
распаковываем tar xf conky-nv.tar.gz, заходим в каталог cd conky-nv и начинаем сборку makepkg если все прошло хорошо, в этом же каталоге должен появиться собранный пакет, остается его только установить pacman -U conky-nv-1.9.0-6-x86_64.pkg.tar.xz(так он будет называется если у вас 64х битная система).
Ну а теперь пользуемся и наслаждаемся рабочим conky.
Мой скрин и конфиг коньков:


~/.conkyrc
conky.config = {
    background = false,
    update_interval = 1,
    cpu_avg_samples = 6,
    net_avg_samples = 2,
    minimum_width = 310,
    temperature_unit = 'celsius',

    double_buffer = true,
    no_buffers = true,
    text_buffer_size = 2048,

    gap_x = 20,
    gap_y = 40,
    own_window = true,
    own_window_type = 'desktop',
    own_window_transparent = true,
    own_window_argb_visual = true,
    own_window_hints = 'undecorated,below,sticky,skip_taskbar,skip_pager',
    border_inner_margin = 0,
    border_outer_margin = 0,
    alignment = 'top_right',

    draw_shades = false,
    draw_outline = false,
    draw_borders = false,
    draw_graph_borders = false,

    override_utf8_locale = true,
    use_xft = true,
    xftalpha = 0.5,
    uppercase = false,

    font = 'caviar dreams:size=10',
    template0 = 'Ubuntu:size=10:weight:bold',
    template1 = 'Ubuntu:size=10:weight:normal',
    template2 = 'Monospace:size=10:weight:normal',
    template3 = 'Sans:size=10:weight:normal',

    default_color = 'FFFFFF',
    color1 = 'DDDDDD',
    color2 = 'AAAAAA',
    color3 = '888888',
    color4 = 'ff5951',
}

conky.text = [[
${font $template0}${color}System
${font $template1}${color}Kernel${alignr}${kernel}
${color}Uptime${alignr}${uptime}

${font $template0}${color}CPU:     ${cpu cpu0}% ${alignr} ${loadavg}
${font $template0}${color}MEM:   ${memperc}% ${alignr}$memeasyfree
${cpugraph cpu0 FF0019 0AFF00 s}
${font $template1}${color}Processes: $processes Running: $running_processes
${font $template2}${color}Name             PID     CPU%   MEM%
${color4} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem_res 1}
${color2} ${top name 2} ${top pid 2} ${top cpu 2} ${top mem_res 2}
${color2} ${top name 3} ${top pid 3} ${top cpu 3} ${top mem_res 3}
${color3} ${top name 4} ${top pid 4} ${top cpu 4} ${top mem_res 4}
${color3} ${top name 5} ${top pid 5} ${top cpu 5} ${top mem_res 5}

${font $template0}${color}Disks I/O:${alignr}$diskio
 ${font $template1}${color}root:${alignr}${fs_free /}
 ${color}tmp:${alignr}${fs_free /tmp}
 ${color}home:${alignr}${fs_free /home}
 ${color}myfiles:${alignr}${fs_free /mnt/myfiles}
 ${color}clsv:${alignr}${fs_free /mnt/clsv}

${font $template0}${color}Network
 ${font $template1}${color}eth1:  ${downspeed eth1}${goto 100}${downspeedgraph eth1 10,60 000000 00ff00}${goto 190}${upspeedgraph eth1 10,60 000000 ff0000}${alignr}${upspeed eth1}
 ${color}total: ${totaldown eth1}${alignr}${totalup eth1}

${font $template0}${color}Ping
 ${font $template1}${color}gateway:${alignr}${execpi 15 cat /tmp/p/IP_ADDRESS}
 ${color}yandex.ru:${alignr}${execpi 15 cat /tmp/p/93.158.134.3}

${font $template0}${color}Temperature
 ${font $template1}${color}CPU:${alignr}${hwmon 2 temp 2}°С
 ${color}System:${alignr}${hwmon 2 temp 1}°С
 ${color}Nvidia GPU:${alignr}${nvidia temp}°С
 ${color}HDD:${alignr}${hddtemp /dev/sdc}°С ${hddtemp /dev/sda}°С ${hddtemp /dev/sdb}°С ${hddtemp /dev/sdd}°С

${font $template0}${color}UPS${apcupsd 192.168.84.5 3551}
${font $template1}${color}Status:${alignr}${apcupsd_status}
${color}Time Left:${alignr}${apcupsd_timeleft}m
${color}Bcharge:${alignr}${apcupsd_charge}%
${color}Voltage:${alignr}${apcupsd_linev}V
${color}Load:${alignr}${apcupsd_load}%

${font $template0}${color}Ports${alignr}${font $template0}${color}Total open: ${tcp_portmon 1 65535 count}

#${font $template0}${color}Yandex.disk
# ${font $template2}${color}Status: ${alignr}${texeci 30 sed -n 2p ~/Yandex.Disk/.sync/status}

${font $template0}${color}Курс $$ и € на ${time %d.%m.%Y}
${font $template2}${color}${execpi 3600 ~/.conky/zabugor.php}
]]

Данный скрипт каждые 10 минут перечитывает файл /path/to/servers_list и пингует адреса указанные там, результаты записывает в /tmp/p/ а конки уже оттуда читает.
~/.conky/ping.sh
#!/bin/bash
path=/tmp/p/
mkdir -p $path
while true; do
    while read ip; do
        time=`ping ${ip} -c 1 -W 5| grep "time=" | awk '{print $7 $8}' | sed 's/time=//g'`
        if [ -z $time ]
            then
                echo "\${color #ff0000}host is down" > ${path}${ip}
            else
                echo "\${color #00ff00}"$time > ${path}${ip}
        fi
    done < "/path/to/servers_list"
    sleep 10
done
/path/to/server_list
93.158.134.3
93.158.134.1
93.158.134.2
В связи скачек доллара, наваял небольшой скриптик на php, который получает с сайта центробанка текущий курс доллара и евро
#!/usr/bin/php
<?php
$currencies = [
    'R01239' => [
        'NumCode' => 978,
        'symbol' => '€',
    ],
    'R01235' => [
        'NumCode' => 840,
        'symbol' => '$$',
    ],
];

$td = date("d/m/Y");
$yd = date("d/m/Y", strtotime('yesterday'));
$data['today'] = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" . $td);
$data['yesterday'] = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" . $yd);

foreach ($currencies as $id => &$params) {
    foreach ($data as $day => $xml) {
        if ($find = $xml->xpath('//Valute[@ID="' . $id . '"]')) {
            if ($find[0]->NumCode == $params['NumCode']) {
                $params[$day] = floatval(str_replace(',', '.', $find[0]->Value));
            }
        }
    }
}

foreach ($currencies as $value) {
    $diff = round($value['today'] - $value['yesterday'], 4);
    $diff = $diff > 0 ? '+' . $diff : $diff;
    print '${alignr}' . $value['symbol'] . '= ' . $value['today'] . "₽ (  $diff  )\n";
}

В массиве $currencies укажите ID и NumCode интересующей вас валюты, посмотреть их можно по ссылке [ http://www.cbr.ru/scripts/XML_daily.asp ]
Всем коньков.

UPD: Обновил заметку 20.03.2019 только конфиг и скрипты.

Комментарии ()

  1. Олег 19 марта 2019, 11:12 # 0
    Прочитал вашу статью, хорошая статья все подробно и понятно написано, спасибо.
    Сделал все как вашей статье, сами конки отображаются, но zabugor.php скрипт не запускается.
    Пожалуйста, помогите разобраться.
    Система у меня 5.0.2-arch1-1-ARCH #1 SMP PREEMPT Thu Mar 14 18:47:49 UTC 2019 x86_64 GNU/Linux.
    Спасибо
    1. cloudsv 19 марта 2019, 13:22(Комментарий был изменён) # 0
      Знаете проблема наверное в том, что у вас не установлен php, у меня он по-умолчанию, так как это частично «мой хлеб».
      Скрипт сейчас проверил все работает, данные получает.
      ${alignr}$$ = 98,3057р
      ${alignr}€ = 64,6694р
      
      Если он вам не помешает можете его установить
      pacman -S php
      
    2. Олег 19 марта 2019, 23:17 # 0
      Спасибо, что так быстро откликнулись, поставил php, все заработало.
      Теперь осталось разобраться почему курс такой странный показывает,
      открыл ссылку из скрипта там вообще не нашел ни 98,3057 ни 64,6694.
      Скрипт как валюту определяет по Valute ID=«R01239» или по NumCode>978?
      Судя по кусочку кода в скрипте Valute[9] я так понял что по Valute ID,
      но как его правильно вставить в скрипт не понял.
      Пожалуйста, помогите и это исправить. Думаю если вы этими конками пользуетесь, вам то же нужен правильный курс.
      Спасибо
      1. cloudsv 19 марта 2019, 23:38 # 0
        Там все безумно примитивно он просто берет порядковый номер в xml
        $xml->Valute[9] — а именно 9, что бы смотрел по ID или numcode нужно переписывать скрипт, если время будет перепишу и сообщу, а так по идее все должно работать, во всяком случае логику я его не правил и у меня отображается курс верно
        1. cloudsv 20 марта 2019, 00:38 # 0
          Специально для вас обновил версию
        2. Олег 20 марта 2019, 16:39 # +1
          Огромнейшее спасибо, все работает, теперь и у меня курс правильный
          Есть вопрос или предложение пиши в Telegram @cloudsv

          MTProto прokси для Telegram

          Прямой эфир

          cloudsv 24 октября 2018, 00:27
          О жизни Обновление Scala Rider G4 4
          cloudsv 21 октября 2018, 23:16
          Arch Linux Памятка по основным утилитам Linux 0