LINUX.ORG.RU

Кто возьмется сделать православный мониторинг для dwm?=)

 , ,


6

5

Появилась мысль сделать кикстартер проект. Сформировать всем месте ТЗ по этому проекту и вложиться деньгами(скажем по $1-2 с человека). По результатам выложить это на suckless, чтобы у всех у нас был хороший гибкий мониторинг. Вообще, такой proj хорош тем, кто хочет поднять свой скилл на си, но если таких не найдется, давайте соберемся шекелями и пусть нам запилят мониторинг

В общем есть у меня скрипт на питоне, который имеет конфиг:

data = {
    'item0':
    {
        'job': 'myout',
        'type': 'system',
        'timeout': 2,
        'state': 'enable',
    },
    'item1':
    {
        'name': '',
        'bracket': '',
        'job': 'internet',
        'type': 'function',
        'timeout': 5,
        'state': 'enable',
        'result': 'UP:LOAD'
    },
    'item2':
    {
        'name': '',
        'bracket': '',
        'job': "weather",
        'type': 'function',
        'timeout': 300,
        'state': 'enable',
        # 'result': '☔:0'
        'result': 'W:0'
    },
    'item4':
    {
        'name': '',
        'bracket': '',
        'job': 'traffic',
        'type': 'function',
        'timeout': 1,
        'state': 'enable',
        'result': 'D:0B    U:0B   '
    },
    'item5':
    {
        'name': '',
        'bracket': '||',
        'job': 'disk',
        'type': 'function',
        'timeout': 60,
        'state': 'enable',
        'result': 'RH:-1,-1,-1'
    },
    'item6':
    {
        'name': '',
        'bracket': '',
        'job': "day",
        'type': 'function',
        'timeout': 15,
        'state': 'enable',
        'result': 'Дн.'
    },
}

Скрипт обходит все item, парсит что это «функция», берет имя функции, и выполняет функцию с указанным таймаутом. Далее пишет информацию в общий массив и отдельный тред берет весь массив и пишет информацию в xsetroot -name. Но в целом всё это я так бы сейчас не написал. Это не православно. Православно как?

делаем конфиг в yml вида:

- item1
   - path: /some/script.py
   - timeout: 15
   - state: enable
   - result: 'UP:LOAD'

Далее в сишке обходим все item, запускаем скрипты с заданным таймаутом и пишем в какой-то общий массив. И с таймаутом 2 секунды запускаем xsetroot и подставляем всю инфу. Таким образом мы можем в мониторинг добавлять свои скрипты хоть на питоне, хоть на луа, хоть на sh и мониторинг будет забирать от них выхлоп. Было бы круто:)

А то некрасиво это:

ps_mem |grep monitoring.py

17.3 MiB + 241.5 KiB =  17.5 MiB       monitoring.py

ps_mem |grep dwm

1.3 MiB + 199.5 KiB =   1.5 MiB       dwm

Сам мониторинг занимает больше памяти, чем wm, лол

Кто возьмётся написать православный monitoring на си для dwm? =)

★★★★

Последнее исправление: bryak (всего исправлений: 5)

Ну, идея вроде бы ничего такая. Пока вы тут думаете и тёрки трёте за бабки демпингуя друг дуга и вереща что их XXX язык лучше всего пдойдёт для встраивания и что канон это писать мониторинги на самих сях я тихонько запилю ^.^ эту штуку.

Только вот одно

xsetroot

Нафейхуя?

anonymous
()
Ответ на: комментарий от anonymous

Это стандартный способ в панельку dwm писать информацию

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от anonymous

Так у самого подобных неплохих идей лежит длинный файл с заметками.

Весь вопрос в приоритетах.

Если есть время, чо бы и не запилить.

wandrien ★★
()
Ответ на: комментарий от anonymous

А мне не нужно. Но если сделаешь, переведу. На моральную поддержку опенсорса.

wandrien ★★
()

И ты считаешь, если из сишки запускать скрипты это православно? Фейспалм. Не надо ниче изобретать, берешь сорцы dwmstatus и пишешь там свой мониторинг на сишке без всяких говноскриптов. Вот это dwm-way.

anonymous
()
Ответ на: комментарий от anonymous

Это для тех странных людей которые хотят dwm, но не хотят ‘С’. Такие есть и их много. В принципе да оверкилл, но может быть удобно. Основной плюс это то что можно добавить модуль для вывода инфы без перезапуска dwm, в конфиг вписал новое и всё оно подхватывает и выводит сразу. Например у тебя кипит работа, но нужно мониторить онлайн ли человек в тентакле, пишешь bash портянку за 1 минуту, прописываешь её как модуль фигак и у тебя на панели «This chmo is [Offline]» ты такой, ну ок, а потом как «This chmo is [Online]» и ты такой ууууууууууу тоби пи**да, а между этими событиями у тебя качается файл в полтерраьбайта который пперывать нельзя потому что докачка не алё внезапно и поэтому перезапускать сессию нельзя.

anonymous
()

Как был ты неучем, так и…
Я смотрю, даже обсуждают…
Вон Анон написал - всё есть! (Им ещё бабки надо, охренеть).

Я знал, что ты калека, но настолько? Бряк? Не стыдно?

anonymous
()

Пытаешься бороться с костылями и предлагаешь еще больший костыль. xsetroot никуда не годится. Нужно делать нормальный ipc. Зачем прибивать гвоздями все к dwm, нужно делать отдельного демона для мониторинга, а вывод в статус dwm - это дополнительная фича. Дело, конечно, твое, но использовать WM_NAME root окна - так себе идея, будут проблемы с синком.

arrecck ★★★
()
Ответ на: комментарий от anonymous

linux-org-ru, ты? а ну пшел пилить игру, разгильдяй.

anonymous
()

я конечно понимаю, что аффтар тот еще месье, но мониторинг на С? да вы же шизики. это будет ненастраиваемым дерьмом.

anonymous
()

Короче я фильм досмотрел попивая чаёк. Пока смотрел вот натыкал

./items.txt

submodule
   command: ./memory.sh
   timeout: 6000
   enabled: true
submodule
   command: ./gpu-load.py
   timeout: 10
   enabled: false
submodule
   command: ./disk.lua
   timeout: 30
   enabled: true

gcc гыыы.c

#define _GNU_SOURCE
#include <pthread.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct executor_item
{
    long   timeout;
    long   curtime;
    bool   enabled;
    char * command;
    char * result;
};

struct executor
{
    char * items_cfg;
    long   items_num;
    struct executor_item * items;
};

struct executor * executor_load_items(const char * file)
{
    FILE * pfile = fopen(file,"r");
    char * pline = malloc(1024);
    size_t    linelen = 1024;
    struct executor * exor = malloc(sizeof(struct executor));
    exor->items_cfg = malloc(strlen(file));
    strcat(exor->items_cfg,file);
    exor->items = malloc(sizeof(struct  executor_item));
    exor->items_num = 0;
    while(getline(&pline,&linelen,pfile) != -1)
    {
        if(strstr(pline,"submodule"))
        {
            exor->items =  realloc(exor->items,sizeof(struct executor_item)*(exor->items_num+1));
            exor->items[exor->items_num].command = malloc(512);
            exor->items[exor->items_num].result  = malloc(512);
            exor->items[exor->items_num].timeout = 0;
            exor->items[exor->items_num].curtime = 0;
            exor->items[exor->items_num].enabled = false;
            exor->items_num++;
            continue;
        };

        char * point = NULL;
        if((point=strstr(pline,"command:"))){
        sscanf(point,"command: %s", exor->items[exor->items_num-1].command);
        }
        if((point=strstr(pline,"timeout:"))){
        sscanf(point,"timeout: %li",&exor->items[exor->items_num-1].timeout);
        }
        if(strstr(pline,"enabled:"))
        {
            if(strstr(pline,"true"))
            {
                  exor->items[exor->items_num-1].enabled = true;
            }else{
                  exor->items[exor->items_num-1].enabled = false;
            }
        }
    }
    free(pline);
    return exor;
};

void executor_print_items(struct executor * exor)
{
    printf("Executor conf file [%s]\n",exor->items_cfg);
    for(long i = 0; i < exor->items_num; i++)
    {
        printf("Item №%li - Enabled [%s] Timeout [%-4li] Command [%s]\n",i,(exor->items[i].enabled)?"true ":"false",exor->items[i].timeout,exor->items[i].command);
    }
}

struct  executor * executor_reload_items(struct executor * exor)
{
    for(long i = 0; i < exor->items_num; i++)
    {
        free(exor->items[i].command);
        free(exor->items[i].result);
    }
    free(exor->items);
    struct executor * exornew =  executor_load_items(exor->items_cfg);
    free(exor->items_cfg);
    free(exor);
    return exornew;
}


int main(int argc, char *argv[])
{
    struct  executor * exor = executor_load_items("./items.txt");
    exor = executor_reload_items(exor);
    executor_print_items(exor);
    return 0;
}

Добавь спавны процессов по таймеру намёк в инклюдах и объединение их выхлопа на общий вывод и всё. Ну, и перепиши по нормальному :D

Всем АДЪёс амиги мну ждут отважные дела!

anonymous
()
Ответ на: комментарий от anonymous

это будет ненастраиваемым дерьмом

Ты dwm вообще видел? Вот такой же и мониторинг будет с настройкой путем правки сишного кода. Если поциент не хочет не может в Си, то и не надо мучать жопу.

anonymous
()
Ответ на: комментарий от anonymous

Не, я не понял, а чё код никто не обосрал, не дополнил не изменил? Я думаю вернусь, а тут тред на 20 страниц забористый. Фу вас. Ж(

anonymous
()
Ответ на: комментарий от anonymous

Ладно хрен с вами завтра job`ы запилю и возможность делать сишные модули которые в виде item.so можно будет задать в конфиге. Но чёт меня коробит pthread явно юзать. Ну, а потом добавить обработку ошибок и простестировать уже в работе, а то сейчас даже в читалке конфига проверок от слова никаких.

2 звезды

3 глазика

Вы чё молчите то алё? Идею бы подкинули. Может годная будет, я себе сделаю. Может даже потом поделюсь.

Я пряма нимагу над вами как дефачки. А ну ка срачавню устроили быздра! Да интеллектуальную! С преферансом.

anonymous
()

что вы там маняторите, что вам постоянно он нужно перед глазами?

anonymous
()
Ответ на: комментарий от anonymous

Чувак, ты слышал поговорку про напрасный труд? Или лучше вздрочни.

anonymous
()
Ответ на: комментарий от wandrien

Я тя умоляю, там три строчки хелуворда. Хотя, да. Лучше завтра, не порти настроение на ночь.

anonymous
()
Ответ на: комментарий от anonymous

Так с телефона неудобно, всё с переносами строк.

wandrien ★★
()
Ответ на: комментарий от gill_beits

slsatatus - фигня. Не один мониторинг на suckless не обладает таким функционалом, как в ТЗ топика, чтобы можно было по-человечески рулить всем этим

bryak ★★★★
() автор топика
Ответ на: комментарий от anonymous

Я на си не писал лет 7. И когда писал, то писал под win. На тех ЯП, которые я знаю, - я могу это реализовать без особых проблем. Но провославно было бы иметь это на си

bryak ★★★★
() автор топика

я думаю оно не так должно работать. процесс должен запускаться один раз и с каким-то интервалом писать в пайп, а что будут делать с этим на другом конце пайпа - это другое дело, может писать в массив, может не писать, может на экран выводить.

твоя проблема в том, что ты написал ни питухоне, перепиши на шеле с run-parts если хочешь, может меньше памяти будет занимать.

anonymous
()
Ответ на: комментарий от anonymous

Полностью согласен. Иначе создание процессов будет дёргать процессор из C7 в C3

bryak ★★★★
() автор топика

Мы такую штуку на Rust пилили. Причём на Rust же и конфигурируется, без внешних конфигов — вполне в идеологии dwm (кроме самого Rust вместо православной сишечки ;D)

Думали, что успеем ещё месяц назад зарелизить и запилить новость, но отложили в долгий ящик. Там ещё по мелочам осталось: вывод причесать, распараллеливание прикрутить (для чего и затевалось, хотя и так намного шустрее портянки на Bash работает), и пару мониторов переделать лучше ;)

mertvoprog
()

Да, что-то я не совсем наблюдаю в https://dwm.suckless.org/status_monitor/ мониторинг, чтобы можно было с разными таймаутами ловить выхлоп от скриптов(модулей). Пилите, годный тред!

serg002 ★★★
()
Последнее исправление: serg002 (всего исправлений: 1)
Ответ на: комментарий от mertvoprog

на Rust

Спасибо, проблевался! Суровый dwm нужен в основном, чтобы не заляпаться в хипстоговне, а тут ты такой приносишь раст. Тогда уж обмазываться вяйлендом, либо на худой конец овсом.

anonymous
()

Никогда не понимал пристрастие к мониторингу. Это чтобы расчесывать иллюзию контроля что ли? Ну коньки запустите, там дохрена всяких циферок.

bread
()
Ответ на: комментарий от bread
  1. Коньки в тайлинге не видны будут
  2. Мониторится то, что нужно. Скажем, поднят линк или нет, up/down, место на диске. Это необходимый минимум
bryak ★★★★
() автор топика
Ответ на: комментарий от bread

Суть dwm`ских мониторингов в избирательном подходе, вывести на панель статус человека онлайн он или нет, вывести значёк онлайн ли какой сервис или нет. Или что угодно иное для чего не предусмотрено чего либо стандартного. Для этого по ходу дело за 5 минут писался скрипт который давал выхлоп его и показывали в уголке, это хорошо и удобно, но когда появляется потребность переодически что-то чекать, но разное личный сборник скриптов превращается в хлам в котором не разобраться. И вот тут то две стороны, первые за то что бы каждый модуль монитринга (да и чего либо другого) был по канону в виде патча к самому dwm то есть что-бы сохранить полную монолитность. С другой стороны что-то внешнее что управляет тем что на «панельке». Оба имеют право на жизнь и есть и используются. Но есть третье, как тут. Сохранить монолитность, но добавить возможность просто автоматизировать нужное, а именно выхлопы той самой коллекции скриптов, включая или отключая ненужные. Благо то что много то ты там не выведешь инфы и поэтому такая штука не будет монстром, а просто удобной приблудой которая если есть и не нужна то и хрен с ней, а если нужна то удобна и не заставит рестартовать оконный менеджер ради внесения изменений как бы это было если человек сторонник полной монолитности dwm АБСОЛЮТНОЙ как ситх.

А вот иллюзии контроля нет, просто контроль есть когда он нужен. Если у тебя нет потребностей следить за состоянием чего либо то это не значит что это не нужно. Просто у тебя не было такой практики и ты не особо в курсе зачем это где и когда нужно.

anonymous
()
Ответ на: комментарий от bryak

Коньки в тайлинге не видны будут

чойта

anonymous
()
Ответ на: комментарий от bread

я рам + свап в коньках мониторю, ибо рамы не бесконечно, и сразу видно если что-то течет или слишком много жрет (с браузером не редкость). а еще загрузку процов, весьма полезно при разработке.

anonymous
()
Ответ на: комментарий от bryak

result: ‘UP:LOAD’

Зачем эти UP:LOAD ? Заглушка или префиксы?

Я вот делаю просто сейчас буферы result и если все item`ы к смене тика обновления статуса успели обновить свои данные о чем они сигнализируют в своих реременных готовности то просто strcat их всех в одно целое и вывожу, но есть скрипты бажные ил вдруг долгие у которых выполнение дольше чем их timeout срабатывания, а старые данные показывать ну как то глупо поэтому их данные стираются, но тогда при объединении получается что вся строка статуса прыгает из за разной длинны, поэтому надо сохранять или выделять длинну вывода что бы даже при пустых данных общя строка статуса была статична по отношению к размеру общему так и размеру отдельных выводимых данных даже если их нет.

anonymous
()
Ответ на: комментарий от anonymous

Честно говоря я этот мониторинг делал лет пять назад. Уже точно и не помню как я там решал тему прыгающих значений. Вроде так

'item4':
    {
        'name': '',
        'bracket': '',
        'job': 'traffic',
        'type': 'function',
        'timeout': 1,
        'state': 'enable',
        'result': 'D:0B    U:0B   '
    },
def traffic(*args, **kwargs):
    def convertSize(size):
        size_name = ("K", "M", "G", "T", "P", "E", "Z", "Y")
        i = int(math.floor(math.log(size, 1024)))
        p = math.pow(1024, i)
        s = int(round(size / p, 2))
        if (s > 0):
            return '%s%s%s' % (s, size_name[i], (5 - len(str(s))) * ' ')
        else:
            return '0B'

    # PPP_INTERFACE = 'eno1'
    # get default interface
    PPP_INTERFACE = (
        cmd_wrapper("route -n | awk \x27$4 == \"UG\" {print $8}\x27")
    ).strip().decode("utf-8")
    
    rxb_old = rxb_new = rxb_result = 0
    txb_old = txb_new = txb_result = 0

    while True:
        try:
            if os.path.exists(INTERFACE_PATH):
                if PPP_INTERFACE in [f for f in os.listdir(INTERFACE_PATH)]:
                    with open('/sys/class/net/%s/statistics/rx_bytes' %
                              PPP_INTERFACE) as fin:
                        rxb_old = rxb_new
                        rxb_new = int(fin.read())
                    with open('/sys/class/net/%s/statistics/tx_bytes' %
                              PPP_INTERFACE) as fin:
                        txb_old = txb_new
                        txb_new = int(fin.read())

                    if rxb_new <= rxb_old:
                        rxb_result = '0B   '
                    else:
                        rxb_result = convertSize(
                            int((rxb_new - rxb_old) / 1024))
                    if txb_new <= txb_old:
                        txb_result = '0B   '
                    else:
                        txb_result = convertSize(
                            int((txb_new - txb_old) / 1024))
                else:
                    raise Exception('Error1')
            else:
                raise

        except Exception as err:
            data[kwargs['item']]['result'] = err

        finally:
            data[kwargs['item']]['result'] = 'D:%(rxb)sU:%(txb)s' %\
                {'rxb': rxb_result, 'txb': txb_result}
            time.sleep(kwargs['data']['timeout'])
bryak ★★★★
() автор топика
Ответ на: комментарий от anonymous

По тредам, которые выполняются дольше, чем поставлен таймаут: по идее, если тред\процесс выполняется, то новый job не надо запускать. Но я не уверен - что это лучшее решение. Может кто-то скажет более оптимальное решение по этому вопросу

bryak ★★★★
() автор топика
Ответ на: комментарий от anonymous

Если модуль бажный: вообще в итемах должно быть дефолт значение, которое показывается до того момента, пока от модулей не начала приходить инфа(UP:LOAD). А бажность сам мониторинг не должен обрабатывать, он тупо должен выводить то, что прилетает от модулей. А обработка ошибок должна быть непосредственно в модулях. Если что - то они могут писать -1 или ‘ERR’

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от anonymous

Как мне кажется, от модулей должны прилетать исключительно строки, а не значения типа int\float. Для единообразия. Т.к от каких-то модулей как раз должны(могут) прилетать значения типа ‘12kпробелпробелпробел’. Иначе в item’ы надо прописывать отдельно возвращаемый формат - что уже есть усложнение

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 5)
Ответ на: комментарий от bryak

Как мне кажется, от модулей должны прилетать исключительно строки

Да. Это обязательно с учётом того что писаться они будут в 99% случаев тяп ляп на коленке тем более что у меня можно в качестве item запускать не только скрипты, но и скомпилированные so библиотеки из которых импортируются функции, эт конечно чуток усложнит всё, но не шибко то и сильно. В целом всё должно быть простым как палка.

Короче по итогу это такой cron на минималках. :D

И да в качестве таймаута просто секунды.

Пишу эту штуку в перерывах между написанием другой в основном во время просмотра фильмов, так что как запилю так и запилю, а может брошу, а может нет. Увидим короче. Так что если кто-то ещё for fun решит взяться то велкам. Я серьёзно тут даже сам dwm не нужен можно отдельно от него всё делать, суть то, 1 строку текста получить :D

anonymous
()
Ответ на: комментарий от anonymous

А зачем загрузка so? Если ты хочешь чтобы на си что-то писало - создай отдельный бинарник, который точно так же будет выплёвывать строку, как это делает sh или py. Думаю, что это не нужно

Пишу эту штуку в перерывах между написанием другой в основном во время просмотра фильмов, так что как запилю так и запилю, а может брошу, а может нет. Увидим короче. Так что если кто-то ещё for fun решит взяться то велкам. Я серьёзно тут даже сам dwm не нужен можно отдельно от него всё делать, суть то, 1 строку текста получить :D

Не-не, порочить имя anonymous нельзя! Анонимус не такой. Он не такой, как эти все со звёздами, который «ля-ля» и бросают на пол пути. Мы все надеемся на тебя xD

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

создай отдельный бинарник

И это можно по умолчанию так ка ничем не отличается от запуска скрипта, но мне захотелось so`шки тоже (удобно переиспользовать например)

Анонимус не такой

:D

anonymous
()
Ответ на: комментарий от anonymous

Чем so удобны, по сравнению с отдельными бинарниками в данном случае? Не надо портить нам самый лучший в мире мониторинг :@)

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.