LINUX.ORG.RU

Сообщения WatchCat

 

ALT Linux дистрибутивы.

Вопрос к знатокам ALT Linux. Хочу развернуть у себя для виртуалок данный дистрибутив. Вопрос в том, что взять для лёгкой основы наподобие Calculate Scratch Server(и есть ли там такое вообще), т.е. базовая установка с минимумом служб и установленных по умолчанию пакетов, чтобы потом собирать виртуалку под конкретную задачу. И есть ли вообще там такое?

 

WatchCat
()

To mold or not to mold Gentoo?

Собственно сам вопрос, а пробовал ли кто-нибудь перевести Дженту на sys-devel/mold и на сколько ощутимо было ускорение при обновлении системы, если таковое было?

 ,

WatchCat
()

postgresql, jsonb и select

День добрый.

Вот такой вопрос возник. Есть таблица item с полем jsonb и в том жысоне есть такая запись:

{
  "time":{
    "start":"2022-10-12T10:00:00Z",
    "end":"2022-10-12T10:05:00Z",
    ...
  }
}

Хочется вытащить в один select эти поля и запихать в таблицу вида (id, time_t, time_v), где id это id записи в таблице item, time_t это тип времени («start», «end», etc ), ну а time_v это само значение.

Может кто-нибудь подсказать как правильно это сделать?

Я попытался сделать через jsonb_each_text и jsonb_extract_path.
И в результате запроса select jsonb_each_text(jsonb_extract_path( item.data, 'time' )) from item я получаю нечто вида

"(end,1998-10-13T06:58:33Z)"
"(gen,2022-05-16T09:08:57Z)"
"(start,1998-10-13T06:51:55Z)"
"(end,1993-08-25T21:39:23Z)"

В доке по jsonb_each_text советуют делать select * from jsonb_each_text(), но как тут это сделать чтобы получить нормальный результат с полями, я что-то не понимаю.

 , ,

WatchCat
()

clang-15 и unqualified-std-cast-call

В пятнадцатом шланге появился флаг unqualified-std-cast-call включённый по умолчанию и теперь то что раньше собиралось, падает с вклюённым по умолчанию -Werror,-Wunqualified-std-cast-call.

Вопрос, что это такое и как его лечить, т.к. я походу совсем потерялся в современных плюсах с его темплейтами.

Вот на какой код ругается:

        template<typename... types_t>
        error call(
            rsComm_t*                     _comm,
            const std::string&            _operation_name,
            irods::first_class_object_ptr _fco,
            types_t...                    _t)
        {
            using namespace std;
...
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... ); // << error: unqualified call to 'std::forward'

Где

                using adapted_func_type = std::function<error(plugin_context&, std::string*, types_t...)>;

                adapted_func_type adapted_fcn = [this, &_operation_name](plugin_context& _ctx, std::string* _out_param, types_t... _t) {

Падает всё сообщением:

In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:6:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_plugin.hpp:5:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_types.hpp:9:
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_plugin_base.hpp:284:54: error: unqualified call to 'std::forward' [-Werror,-Wunqualified-std-cast-call]
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... );
                                                     ^
                                                     std::
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:284:24: note: in instantiation of function template specialization 'irods::plugin_base::call<RcComm *, const char *>' requested here
    ret = auth_plugin->call <rcComm_t*, const char* > ( NULL, irods::AUTH_CLIENT_START, auth_obj, _comm, _context );
                       ^
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:6:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_plugin.hpp:5:
In file included from /var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_auth_types.hpp:9:
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_plugin_base.hpp:284:54: error: unqualified call to 'std::forward' [-Werror,-Wunqualified-std-cast-call]
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... );
                                                     ^
                                                     std::
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/include/irods_plugin_base.hpp:284:54: error: unqualified call to 'std::forward' [-Werror,-Wunqualified-std-cast-call]
                return adapted_fcn( ctx, &out_param, forward<types_t>(_t)... );
                                                     ^
                                                     std::
/var/calculate/tmp/portage/net-misc/irods-4.2.11-r6/work/irods-4.2.11/lib/core/src/clientLogin.cpp:292:24: note: in instantiation of function template specialization 'irods::plugin_base::call<RcComm *>' requested here
    ret = auth_plugin->call <rcComm_t* > ( NULL, irods::AUTH_CLIENT_AUTH_REQUEST, auth_obj, _comm );
                       ^
3 errors generated.

 ,

WatchCat
()

FireFox и userapi.com

Заметил, что в FF на любых страницах не встраиваются изображения с userapi.com. Хотя, если открыть в новой вкладке, то всё нормально загружается. Это у меня так или это FF глючит?

 

WatchCat
()

Git: удаление старого дерева в репозитории после rebase.

Было git-дерево A0-B0-C0-D0-E0-...
Решил сделать его ребейз с корня со слиянием коммитов и в итоге получилось совершенно новое дерево A1-B1-D1-E1-....
Так вот, в репозитории хранится оба дерева. Тот же qgit показывает всю репу как A0-B0-...-Z0 A1-B1-...-Z1
Вопрос, как удалить старое дерево в репозитории без его пересоздания?

 

WatchCat
()

mkfs.ext4 fail

Пытаюсь создать файловую систему и тут меня посылают нафиг:

mkfs.ext4 /dev/mapper/data3
mke2fs 1.45.5 (07-Jan-2020)
Invalid filesystem option set: fast_commit,has_journal,extent,huge_file,flex_bg,metadata_csum,64bit,dir_nlink,extra_isize

Что ей не нравится?

gentoo старая и не обновлялась уже года два и не может обновиться, а переустанавливать нет сейчас времени.

 ,

WatchCat
()

Это баг в GCC 11.2 или я что-то упустил?

После обновы до 11.2 столкнулся с тем, что следующий код перестал компилироваться:

#include <iostream>
using namespace std;

#pragma pack(1)
struct RGBA {
    union {
        uint32_t word;
        struct {
            uint8_t r;
            uint8_t g;
            uint8_t b;
            uint8_t a;
        } rgba;
};
};
#pragma pack()

const RGBA RGBA_WHITE = { .rgba = { 0xff, 0xff, 0xff, 0xff } };
const RGBA RGBA_RED   = { .rgba = { 0xff, 0x00, 0x00, 0xff } };
const RGBA RGBA_GREEN = { .rgba = { 0x00, 0xff, 0x00, 0xff } };
const RGBA RGBA_BLUE  = { .rgba = { 0x00, 0x00, 0xff, 0xff } };
const RGBA RGBA_BLACK = { .rgba = { 0x00, 0x00, 0x00, 0xff } };
const RGBA RGBA_GREY  = { .rgba = { 0x80, 0x80, 0x80, 0xff } };
const RGBA RGBA_NONE  = { .rgba = { 0x00, 0x00, 0x00, 0x00 } };

int main(){
    auto color = RGBA_WHITE;
    cout << color.word << endl;
    color = RGBA_RED;
    cout << color.word << endl;
    return 0;
}

gcc 11.1 и ранее нормально компилируют, gcc 11.2 и trunk выдают ошибку:

source>:18:62: error: too many initializers for 'RGBA::<unnamed union>'
   18 | const RGBA RGBA_WHITE = { .rgba = { 0xff, 0xff, 0xff, 0xff } };
      |                                                              ^
<source>:19:62: error: too many initializers for 'RGBA::<unnamed union>'
   19 | const RGBA RGBA_RED   = { .rgba = { 0xff, 0x00, 0x00, 0xff } };
      |                                                              ^
WatchCat
()

Индексация JSONB в PostgreSQL для timestamp

Есть некая таблица хранящая JSONB в котором есть примерно следующие значения:

{
  "time": {
    "start": "2020-09-11T21:31:04Z"
    "end": "2020-09-11T21:44:10Z",
  }
}

И хочется их проиндексировать для ускорения поиска.

Но вот дело в том, что в строке хранится по сути «timestamp with timezone», а на него постгря ругается:

CREATE INDEX gen_time_index ON item (((data->'time'->>'start')::timestamp));

ERROR: ОШИБКА:  функции в индексном выражении должны быть помечены как IMMUTABLE

SQL state: 42P17

Как бы это можно было бы обойти?

Да, можно конечно завести отдельную таблицу/поле с типом timestamp и триггером заполнять. Но хотелось бы без лишних телодвижений.

 ,

WatchCat
()

Как перекинуть корзину(enclosure) с одной LSI карточки на другую?

Есть машина с LSI контроллером(9361-8i) к которому на внешние SAS-разъёмы(SFF-8087 to SFF-8088 адаптер) подключено два ящика с дисками и на них развёрнуты рейды(на каждой корзине свой).

Необходимо одну корзину перекинуть на другой LSI контроллер(LSI 9380-8e) на другой машине без потерь данных.

Вопрос, как это сделать корректно? Если просто переткнуть кабель, карточка корректно подхватит или необходимы какие-то телодвижения?

Про storcli /cX get config file=file_name знаю. Но эта команда сохраняет весь конфиг карточки, а не отдельных элементов.

 ,

WatchCat
()

with recursive в PostgreSQL

Есть банальная таблица для хранения древовидной структуры:

CREATE TABLE test (
   tid serial PRIMARY KEY,
   pid INTEGER,
   name VARCHAR NOT NULL
   -- на самом деле тип name это домен с проверкой, но в данном случае это не важно КМК
   -- да и constraint'ы опустим.
);

И есть две задачи:

  • Найти запись в соответствии с заданным путём n1.n2.n3.n4
  • Найти ближайший элемент к заданному пути. Т.е. например для n1.n2.n3.n4 вернуть запись с путём n1.n2 т.к. у n1.n2 нет потомков.

Покопавшись с WITH RECURSIVE для первой задачи получилось такое себе решение:

WITH RECURSIVE r1 as (
  SELECT t1.tid, t1.pid, t1.name, cast( t1.name as text ) as path
  FROM test t1 WHERE pid is null and t1.name = split_part('n1.n2.n3.n4', '.', 1)
    UNION
  SELECT t2.tid, t2.pid, t2.name, r1.path || '.'|| t2.name as path
  FROM test t2
  join r1 on t2.pid = r1.id
)
select * from r1 where path = 'n1.n2.n3.n4';

Хотя меня несколько напрягает сравнение строк, но я не уверен как сделать быстрее.

И по второму вопросу не могу докумекать, как всё это реализовать. Может кто-нибудь чего подскажет?

 ,

WatchCat
()

Modern CMake пакеты и их <package>-config.cmake

Если раньше после успешного выполнения find_package появлялось множество переменных вида <package_name>_..., как например у libarchive:

-- LIBARCHIVE_CFLAGS=
-- LIBARCHIVE_CFLAGS_I=
-- LIBARCHIVE_CFLAGS_OTHER=
-- LIBARCHIVE_FOUND=1
-- LIBARCHIVE_INCLUDEDIR=/usr/include
-- LIBARCHIVE_INCLUDE_DIRS=
-- LIBARCHIVE_LDFLAGS=-larchive
-- LIBARCHIVE_LDFLAGS_OTHER=
-- LIBARCHIVE_LIBDIR=/usr/lib64
-- LIBARCHIVE_LIBRARIES=archive
-- LIBARCHIVE_LIBRARY_DIRS=
-- LIBARCHIVE_LIBS=
-- LIBARCHIVE_LIBS_L=
-- LIBARCHIVE_LIBS_OTHER=
-- LIBARCHIVE_LIBS_PATHS=
-- LIBARCHIVE_LINK_LIBRARIES=/usr/lib64/libarchive.so
-- LIBARCHIVE_MODULE_NAME=libarchive
-- LIBARCHIVE_PREFIX=/usr
-- LIBARCHIVE_STATIC_CFLAGS=
-- LIBARCHIVE_STATIC_CFLAGS_I=
-- LIBARCHIVE_STATIC_CFLAGS_OTHER=
-- LIBARCHIVE_STATIC_INCLUDE_DIRS=
-- LIBARCHIVE_STATIC_LDFLAGS=-larchive;-lcrypto;-lacl;-llzo2;-llzma;-lzstd;-llz4;-lbz2;-lz;-lxml2
-- LIBARCHIVE_STATIC_LDFLAGS_OTHER=
-- LIBARCHIVE_STATIC_LIBDIR=
-- LIBARCHIVE_STATIC_LIBRARIES=archive;crypto;acl;lzo2;lzma;zstd;lz4;bz2;z;xml2
-- LIBARCHIVE_STATIC_LIBRARY_DIRS=
-- LIBARCHIVE_STATIC_LIBS=
-- LIBARCHIVE_STATIC_LIBS_L=
-- LIBARCHIVE_STATIC_LIBS_OTHER=
-- LIBARCHIVE_STATIC_LIBS_PATHS=
-- LIBARCHIVE_VERSION=3.5.1
-- LIBARCHIVE_libarchive_INCLUDEDIR=
-- LIBARCHIVE_libarchive_LIBDIR=
-- LIBARCHIVE_libarchive_PREFIX=
-- LIBARCHIVE_libarchive_VERSION=

Т.е. делаешь target_link_libraries(target ${LIBARCHIVE_LIBRARIES}) или там target_include_directories и вроде всё понятно что откуда берётся с чем линкуется. Теперь же многие переходят на -config.cmake и там вообще толком никаких переменных не объявляется. Как например у libfmt:

-- fmt_CONFIG=/usr/lib64/cmake/fmt/fmt-config.cmake
-- fmt_CONSIDERED_CONFIGS=/usr/lib64/cmake/fmt/fmt-config.cmake
-- fmt_CONSIDERED_VERSIONS=7.0.3
-- fmt_DIR=/usr/lib64/cmake/fmt
-- fmt_FOUND=1
-- fmt_VERSION=7.0.3
-- fmt_VERSION_COUNT=3
-- fmt_VERSION_MAJOR=7
-- fmt_VERSION_MINOR=0
-- fmt_VERSION_PATCH=3
-- fmt_VERSION_TWEAK=0

Т.е. ни _INCLUDEDIR, ни _LIBRARIES нет. И вот как с этим работать? Как мне линковать мой таргет с libfmt? Кто-нибудь может подсказать?

 

WatchCat
()

std::copy_n не перемещает итератор на следующий символ за последним скопированным.

Собственно код:

#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;

int main(){
    string src("01234567890123456789");

    string dst1;
    dst1.reserve(6);

    string dst2;
    dst2.reserve(6);

    istringstream is(src);

    copy_n( std::istreambuf_iterator<char>( is ), 6, std::back_inserter( dst1 ) );
    cout << dst1 << endl;

    copy_n( std::istreambuf_iterator<char>( is ), 6, std::back_inserter( dst2 ) );
    cout << dst2 << endl;
}

Вывод:

$ g++ t.cpp && ./a.out 
012345
567890

Хотя по идее должно быть:

012345
678901

Или я чего-то не понимаю?

ЗЫ:

$ g++ -v
Используются внутренние спецификации.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/9.3.0/lto-wrapper
Целевая архитектура: x86_64-pc-linux-gnu
Параметры конфигурации: /var/calculate/tmp/portage/sys-devel/gcc-9.3.0-r1/work/gcc-9.3.0/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/9.3.0 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/9.3.0 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/9.3.0/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/9.3.0/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/g++-v9 --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/9.3.0/python --enable-languages=c,c++,objc,fortran --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 9.3.0-r1 p3' --disable-esp --enable-libstdcxx-time --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-fixed-point --enable-targets=all --enable-libgomp --disable-libmudflap --disable-libssp --disable-libada --disable-systemtap --enable-vtable-verify --enable-lto --with-isl --disable-isl-version-check --enable-default-pie --enable-default-ssp
Модель многопоточности: posix
gcc версия 9.3.0 (Gentoo 9.3.0-r1 p3) 

 

WatchCat
()

char*, string_view и ostream

Тут с переходом на свежий pqxx вылезла такая проблема.

Если раньше для новых типов в string_traits<T> они требовали реализацию метода string to_sting() и мне было достаточно банального ostringstream, то сейчас они требуют реализацию static zview to_buf (char *begin, char *end, TYPE const &value), т.е. требуется возвращать string_view для заданного буфера.

В общем вопрос простой, как можно использовать ostream для внешнего буфера, используя только библиотечные классы? При этом нельзя переполнять буфер и переалоцировать его тоже.

Пока я так понял, что придётся реализовать свoй basic_streambuf. Т.к. стандартный basic_stringbuf, во-первых, хочет string, а, во-вторых, буфер переданный в string который передадут в ostringstream может быть переаллоцирован.

UPD. Впрочем как оказалось всё достаточно элементарно и давно есть в примерах на cppreference.

template<typename _CharT, class _Traits = char_traits<_CharT>> class my_ostreambuf: public basic_streambuf<_CharT, _Traits> {
private:
protected:
    my_ostreambuf() {
    }
public:
    using _Base = basic_streambuf<_CharT, _Traits>;
    using char_type = typename _Base::char_type;

    my_ostreambuf( char_type* begin, char_type* end ) {
        _Base::setp(begin, end);
    }

    basic_string_view<_CharT, _Traits> get_view() {
        return basic_string_view<_CharT, _Traits>( _Base::pbase(), _Base::pptr() - _Base::pbase() );
    }

    virtual ~my_ostreambuf() = default;
};

typedef my_ostreambuf<char> char_ostreambuf;

 ,

WatchCat
()

Проблемы с загрузкой nvidia драйвера .

Словил тут после обновления Gentoo странную вещь при загрузке драйвера nvidia

[498966.989501] nvidia: version magic '4.19.146-gentoo SMP mod_unload ' should be '4.19.146-gentoo SMP preempt mod_unload '

Версия x11-drivers/nvidia-drivers 435.21-r6

В ядре соответственно preempt включен:

# uname -a
Linux japet 4.19.146-gentoo #6 SMP PREEMPT Thu Oct 22 08:30:10 UTC 2020 x86_64 Intel(R) Core(TM) i5-4200M CPU @ 2.50GHz GenuineIntel GNU/Linux

Более новое не ставлю, т.к. GeForce GT 740M в 440-х и выше вроде не поддерживается а старые nvidia драйвера под более свежими ядрами не собираются.

Собственно, кто неправильно выставляет kernel magic и как это побороть?

 ,

WatchCat
()

проблемы с std::variant of lambda

Обмазываюсь тут 17-ми плюсами и захотелось поизвращаться.

Есть вот такой пример:

#include <iostream>
#include <variant>
#include <functional>
using namespace std;

int main( int argc, const char* argv[] ) {
    using variant1 = variant< function<void()>, function<void( optional< string > )> >;
    variant1 t1,t2;
    t1 = []() {
        cout << "t1" << endl;
    };
    t2 = []( optional<string> v ) {
        cout << v.value_or( "none!" ) << endl;
    };

    using variant2 = variant< function<void()>, function<void( optional< string > )>, function< void( string ) > >;
    variant2 t3,t4,t5;
    
    t3 = []() {
        cout << "t1" << endl;
    };

    // Вот тут ошибка компиляции
    t4 = []( optional<string> v ) {
        cout << v.value_or( "none!" ) << endl;
    };

    t5 = []( string v ){
        cout << v << endl;
    }

    return 0;
}

И получаю следующую ошибку:

/home/user/tmp/1/test1.cpp:28:2: error: no match for ‘operator=’ (operand types are ‘variant2’ {aka ‘std::variant<std::function<void()>, std::function<void(std::optional<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >)>, std::function<void(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)> >’} and ‘main(int, const char**)::<lambda(std::optional<std::__cxx11::basic_string<char> >)>’)

Понятно, что проблема решается прямым указанием типа:

    t4 = ( function<void( optional< string > )> ) []( optional<string> v ) {
        cout << v.value_or( "none!" ) << endl;
    };

Но мне интересно, в чём тут грабли. Т.е. по каким-то причинам компилятор перестал распознавать сигнатуру? Путает optional<string> и string? Или что тут такое может быть?

 

WatchCat
()

Компактная библиотека для растровой графики для C++.

Посоветуйте subj?
Надо что-то, что может работать со слоями и примитивами.
Т.е. наложить один битмап на другой с использованием маски/альфаканала/етц и нарисовать сверху примитивы и текст.
Желательно на C++ и с возможностью статической линковки.
Ну и сохранить это всё в один зи форматов по выбору, png/jpeg/tiff/etc. Всё это должно работать без каких либо гуёв и 3d ускорения.

GTK и Qt мне кажутся несколько оверкилл.
Да, ImageMagick сейчас используется, но без матов о некоторых его особенностях высказаться не могу.

 , ,

WatchCat
()

left outer join и проблемы с JPQL.

Есть два стула… т.е. две таблицы.

CREATE TABLE scheme
(
    id integer NOT NULL,
    command character varying(1024),
    CONSTRAINT scheme_pkey PRIMARY KEY (id)
)

и

CREATE TABLE task
(
    id integer NOT NULL,
    scheme_id integer NOT NULL,
    CONSTRAINT task_pkey PRIMARY KEY (id),
    CONSTRAINT task_to_scheme_fk FOREIGN KEY (scheme_id)
        REFERENCES scheme (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
        DEFERRABLE
)

К ним есть два JPA-класса.

@Entity
public class Scheme {

    @Id
    @GeneratedValue
    private Integer id;

    @Basic
    private String command;

}

и

@Entity
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne( optional = false )
    @JoinColumn( name = "scheme_id" )
    private Scheme scheme;

}

И мне надо посчитать сколько task у каждой scheme. В том же sql это делается просто:

SELECT scheme.id AS scm, count(task.id) AS cnt
FROM scheme
LEFT OUTER JOIN task on task.scheme_id = scheme.id
GROUP BY scheme.id
ORDER BY cnt ASC, scm ASC;

И вывод:

11	"0"
1	"4"
2	"4"
4	"4"
6	"4"

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

 , jpql

WatchCat
()

Gloox требует ручной thread sleep при отправке. Или нет?

Пытаюсь написать простого отправителя сообщений для xmpp. Решил воспользоваться gloox. Так вот, оказалось, что без ручного засыпания сообщение теряется. Вопрос, если кто знает, как в gloox дождаться отправки сообщения и только потом выйти?

Пример кода:

class MyMessenger: public ConnectionListener {
public:
    MyMessenger(): client( 0 ) {}

    ~MyMessenger() {
        if( client ) delete( client );
    }

    virtual void onConnect() override {
        JID to(DST_JID);
        MessageSession* session = new MessageSession( client, to );
        session->send("test message");
        // вот без этого сообщение теряется.
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        client->disposeMessageSession(session);
        client->disconnect();
    };

    virtual void onDisconnect( ConnectionError ce ) override {
        if( ce == ConnAuthenticationFailed )
            cerr << "Auth failed. Reason: " << client->authError() << endl;
    }

    virtual bool onTLSConnect( const CertInfo& ) override {
        return true;
    }

    void start() {

        JID jid( USER_JID );

        client = new Client( jid, USER_PASS );

        client->setServer( SERVER );
        client->setPort( PORT );
        client->setTls( TLSRequired );

        client->registerConnectionListener( this );

        if( client->connect( false ) ) {
            ConnectionError ce = ConnNoError;

            while( ce == ConnNoError ) {
                ce = client->recv();
            }
            cerr << "ce: " << ce << endl;
        }

    }

private:
    Client* client;
};

 ,

WatchCat
()

snmptrapd дважды вызывает traphandle

Собственно сабж.

Поставил в Gentoo snmptrapd с таким конфигом:

doNotLogTraps yes

traphandle default /opt/bin/snmp-trap-handle

disableAuthorization yes


Сам скрипт простой:
#!/bin/bash
read HOST
read IP
echo "${HOST}" "${IP}" >> /opt/bin/test.out


Посылаю событие:
snmptrap -v 1 -c sys-info 127.0.0.1 .1.3.6.1 localhost 6 17 '' .1.3.6.1 s "Test trap 0"


В итоге в test.out оказываются две одинаковые строчки.

Кто-нибудь с подобным сталкивался и как это лечить?

Установленная версия
$ eix net-analyzer/net-snmp
[I] net-analyzer/net-snmp
     Available versions:  5.7.3-r5^t (~)5.7.3-r6^t (~)5.7.3_p3-r1^t (~)5.8-r1(0/35)^t **99999999(0/35)^t {X bzip2 doc elf ipv6 libressl lm_sensors mfd-rewrites minimal mysql netlink pci perl python rpm selinux smux ssl tcpd ucd-compat zlib PYTHON_TARGETS="python2_7"}
     Installed versions:  5.8-r1(0/35)^t(06:50:56 PM 02/21/2019)(bzip2 ipv6 lm_sensors ssl tcpd zlib -X -doc -elf -libressl -mfd-rewrites -minimal -mysql -netlink -pci -perl -python -rpm -selinux -smux -ucd-compat PYTHON_TARGETS="python2_7")
     Homepage:            http://www.net-snmp.org/
     Description:         Software for generating and retrieving SNMP data


UPD

Make sure to remove the -c /etc/snmp/snmptrapd.conf part, otherwise you will receive TRAP twice, as snmptrapd' is compiled with the default configuration file path being already set to '/etc/snmp/snmptrapd.conf'.

 ,

WatchCat
()

RSS подписка на новые темы