LINUX.ORG.RU

Сообщения wolverin

 

mariadb 10.3.39 не меняются переменные из конфига

Приветствую

Некоторые изменения нужно внести в конфиг в частности innodb_buffer_pool_size хочу дефолтные поднять

написано так

:/etc/mysql/mariadb.conf.d# grep -v ^# 50-server.cnf

[server]

[mysqld]

user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
socket                  = /run/mysqld/mysqld.sock
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql

bind-address            = 127.0.0.1


query_cache_size        = 16M

log_error = /var/log/mysql/error.log
expire_logs_days        = 10


character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

innodb_buffer_pool_size = 268435456


[embedded]

[mariadb]

[mariadb-10.3]

захожу в клиента смотрю после рестарта

MariaDB [(none)]> show variables like 'innodb_buffer_pool%';
+-------------------------------------+----------------+
| Variable_name                       | Value          |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size       | 134217728      |
| innodb_buffer_pool_dump_at_shutdown | ON             |
| innodb_buffer_pool_dump_now         | OFF            |
| innodb_buffer_pool_dump_pct         | 25             |
| innodb_buffer_pool_filename         | ib_buffer_pool |
| innodb_buffer_pool_instances        | 1              |
| innodb_buffer_pool_load_abort       | OFF            |
| innodb_buffer_pool_load_at_startup  | ON             |
| innodb_buffer_pool_load_now         | OFF            |
| innodb_buffer_pool_size             | 134217728      |
+-------------------------------------+----------------+

Почему так? из клиента устанавливается нормально как

SET GLOBAL innodb_buffer_pool_size = 256000000;

 ,

wolverin
()

Подсчет потерь (алгоритм)?

Приветствую.

Нуждаюсь в идеи )

Сцуть - есть 100500 железок в интернетах, которые раз в 10-15 минут опрашиваются, в БД в поле отправленных запросов пишу +1, когда ответ приходит (снимок) в БД в поле полученных ответов пишу +1 и дата-время последнего ответа

Вопрос - как посчитать АКТУАЛЬНОЕ количество потерь в % скажем за 10 или 100 опросов??? так чтобы не плодить количество записей

 

wolverin
()

No space left on device

Приветствую.

как такое может быть, что

# df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/mmcblk1p1   40M   12M   29M  30% /mnt/mmcblk0p1
/dev/mmcblk1p2  1.2G  1.1G     0 100% /mnt/mmcblk0p2
/dev/mmcblk1p3  2.5G  600M  1.9G  25% /mnt/mmcblk0p3

НО

# cp 512MB.swap /mnt/mmcblk0p3/
cp: cannot create regular file '/mnt/mmcblk0p3/512MB.swap': No space left on device

 , , , ,

wolverin
()

nftables для FQDN

Приветствую.

Раз уж приходится переходить с iptables, которое сабж не умеет, на nftables появилась такая возможность?

 ,

wolverin
()

Ламбда в списке инициализации конструктора ?

Приветствую.

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

class CParamsTXT
{
private:
    const bool bAutoCommit;
    IBPP::Transaction tr;
    IBPP::Statement st;
    CDefFile * pCfg;
    const string Typ, Section, id_bank;

    bool getAutoCommit(IBPP::Transaction tr)
    {
fprintf(stderr, "\n111 111\n");
        const bool rt = !tr->Started();
        if (rt) tr->Start();
        return rt;
    }

protected:
    string GetParam(string & param, string Field, string Ident, string Default = "")
    { ... }

public:
    const string DateFormat, DatePoint, DecPoint, codepage;
    vector<string> svF;
    const char cNote;

    CParamsTXT(CDefFile * pCfg_, IBPP::Transaction tr_, IBPP::Statement st_, string Typ_, string Section_, string id_bank_, string DateFormat_, string DatePoint_, string DecPoint_, string codepage_, string Note_)
    :
        bAutoCommit([](IBPP::Transaction tr_){
fprintf(stderr, "\n111 222\n");
            const bool rt = !tr_->Started();
            if (rt) tr_->Start();
            return rt;}),
//      bAutoCommit(getAutoCommit(tr_)),
        tr(tr_), st(st_), pCfg(pCfg_),
        Typ(Typ_), Section(Section_), id_bank(id_bank_),
        DateFormat(GetParam(DateFormat_, "date_format", "DateFormat", "d/m/y")),
        DatePoint(GetParam(DatePoint_, "date_point", "DatePoint", "/")),
        DecPoint(GetParam(DecPoint_, "dec_point", "DecPoint", ".")),
        codepage(GetParam(codepage_, "codepage", "codepage", "DOS")),
        cNote(GetParam(Note_, "note", "NoteTXT", "")[0])
    { }

 

wolverin
()

DHCP не обновляет BIND9

Приветствую.

Очередная проблема после поднятия версии Debian c 8 до 10: isc-dhcp-server перестал обновлять локальную зону на шлюзе, из ошибок вижу такие сообщения

Nov 22 12:23:34 server dhcpd[]: DDNS: cleaning up lease pointer for a cancel cb=0x557dffa84800
Nov 22 12:23:34 server dhcpd[]: Unable to add forward map from имяхоста.имядомена.ru to 192.168.xxx.xxx: operation canceled

в бинде вообще тишина, никаких запросов нет

Делал конфиг когда то под Debian 6 конечно, но все работало пока не обновился

# grep -v ^# dhcpd.conf

ddns-update-style interim;
ddns-updates on;
ddns-domainname "имядомена.ru";
do-forward-updates on;
update-static-leases on;
ignore client-updates;
update-conflict-detection false;

include "/etc/dhcp/dhcpd.key";

zone имядомена.ru {
    primary 192.168.xxx.2;
    key DHCP_UPDATER;
}

zone xxx.168.192.in-addr.arpa {
    primary 192.168.xxx.2;
    key DHCP_UPDATER;
}

option domain-name "имядомена.ru";
option domain-name-servers 192.168.xxx.2;

option local-pac-server code 252 = text;
option local-pac-server "http://proxy/proxy.pac\000";

default-lease-time 36000;       # 10h
max-lease-time 86400;           # 24h

authoritative;

log-facility local7;

shared-network имясети {
    subnet 192.168.xxx.0 netmask 255.255.255.0 {
        range 192.168.xxx.10 192.168.xxx.250;
        option broadcast-address 192.168.xxx.255;
        option routers 192.168.xxx.2;
        option ntp-servers 192.168.xxx.2;
        filename "pxelinux.0";
        next-server 192.168.xxx.1;
    }
}

host имя1 {
    hardware ethernet 52:54:00:8b:xx:xx;
    fixed-address 192.168.xxx.xxx;
}

пока гуглеж не помогает, может кто сталкивался?

 ,

wolverin
()

Импорт ключей gpg

Приветствую.

После поднятия версии Debian c 8 до 10 перестали работать ключи, пытаюсь по новой их импортировать - пишет ошибку

$ gpg --import PUBRING.PGP
gpg: Всего обработано: 2
gpg:         пропущено ключей PGP-2: 2

Тут конечно написаны такие ужасы

Some algorithms and parts of the protocols as used by the 20 years old PGP-2 software are meanwhile considered unsafe.

With GnuPG 2.1 all support for those keys has gone.

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

 

wolverin
()

libvirtd не грузится

Приветствую.

После поднятия версии Debian c 8 до 10 не запускается виртуалка с ошибкой

libvirtd[9019]: /usr/sbin/libvirtd: symbol lookup error: /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4: undefined symbol: libssh2_scp_recv2

либы стоят

# apt policy libssh2-1
libssh2-1:
  Установлен: 1.8.0-2.1+deb10u1
  Кандидат:   1.8.0-2.1+deb10u1
  Таблица версий:
 *** 1.8.0-2.1+deb10u1 500
        500 http://security.debian.org buster/updates/main amd64 Packages
        100 /var/lib/dpkg/status
     1.8.0-2.1 500
        500 http://mirror.yandex.ru/debian buster/main amd64 Packages

# apt policy libcurl3-gnutls
libcurl3-gnutls:
  Установлен: 7.64.0-4+deb10u7
  Кандидат:   7.64.0-4+deb10u7
  Таблица версий:
 *** 7.64.0-4+deb10u7 500
        500 http://security.debian.org buster/updates/main amd64 Packages
        100 /var/lib/dpkg/status
     7.64.0-4+deb10u2 500
        500 http://mirror.yandex.ru/debian buster/main amd64 Packages

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

 ,

wolverin
()

Для чего alignas?

Приветствую.

Про определение о требовании выравнивания читал конечно. Но таки как выбирается аргумент??? чтобы получить кучи прироста производительности )

Т.е. я например объявляю объекты как

alignas(64) std::atomic<size_t> tail;
alignas(64) std::atomic<size_t> head;

на xeon прирост в 2 раза, а на виртуалке можно считать погрешностью, но при 16 уже на виртуалке хоть и маленький, но таки -5% времени выполнения, при этом на процессоре падение.

 ,

wolverin
()

dkim pubkey_unavailable

приветствую.

савчера вдрух mail.ru начал мозги делать доставкой писем по поводу SPF, DKIM, DMARC

вроде все сделал по их инструкции https://help.mail.ru/postmaster/technical-settings/notes

добавил в bind9 3 записи вида

@       IN TXT "v=spf1 a mx ~all"
@       IN TXT "v=DKIM1; k=rsa; p=ПУБЛИЧНЫЙКЛЮЧ"
@       IN TXT "v=DMARC1; p=none"

поставил opendkim, прописал там соответственно место приватного ключа, в postfix сконфигрурировал на использование opendkim

один фих они пишут мне в заголовке

Authentication-Results: mxs.mail.ru; spf=pass (mx324.i.mail.ru: domain of ДОМЕН designates IPадрес as permitted sender) smtp.mailfrom=wolverin@ДОМЕН smtp.helo=mail.ДОМЕН;
	 dkim=invalid reason=pubkey_unavailable header.d=ДОМЕН
Received-SPF: pass (mx324.i.mail.ru: domain of ДОМЕН designates IPадрес as permitted sender) client-ip=IPадрес; envelope-from=wolverin@ДОМЕН; helo=mail.ДОМЕН;

DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=ДОМЕН; s=mail;
	t=1698894939; bh=JjZLfQmoespEUwGKuwbvnkkjWozy3SgKdtKb0xyF/W4=;
	h=Date:From:To:Subject:From;
	b=o+dgSgqvHNSmHZaJgs+9T6ErJ8sM8CMYLiaMRVgIZ4ED3hqE4yb/Vxy3x2j8Xb7qz
	 03wTwz4AFtmAR/UrSXjKSvCYiusvtSomimsWbUfvq/fNHhWZxLfQntnGEGO+RLTL+T
	 izuF0e1ptd/ZjmvrzBI5m9OZjQtoeLkLleP1vNLY=

User-Agent: Roundcube Webmail/1.2.3
X-DKIM-FAIL: DKIM test failed: invalid (address=wolverin@ДОМЕН domain=ДОМЕН reason=pubkey_unavailable).
X-Mailru-Src: mx
X-4EC0790: 10
X-6b629377: 1
X-7564579A: 646B95376F6C166E
X-77F55803: E822A06ED42C499A7F63DA2F9F2A54461ED951AC22C7845A9D1D1EE593088C900BBDAAE39103F3638701F0628C4B95CB650AB02DA031907FC423C6D7DB1CDA95F7F2529DD7A3558E4DF7BC4678047644
X-7FA49CB5: A9FCD207E66530D8A18204E546F3947C6807E7B3823913D9AFB8EE5BB20AF148C8A9BA7A39EFB7663CFE1401686631C009758206774B3CD2D5E8D9A59859A8B61831C2A8CBD9F7CA71492C2D3FF63AF69449624AB7ADAF37FD314BCFCDE4A234277E793F4B08E8842DAF2A56518EC330CC198E72ECD316A4BD9CCCA9EDD067B1FF0C04525729832C4E1E7243831EC1F578DA827A17800CE786D80B7E7735AB376320D30F47244B793CFE1401686631C082BFA309970D60C2B287FD4696A6DC2F5F5C1EE8F4F765FC04C22ED69F47F2D8B287FD4696A6DC2FA8DF7F3B2552694A4E2F5AFA99E116B42401471946AA11AF176DF2183F8FC7C086614E11AFA257BF8F08D7030A58E5ADC58D69EE07B1408453DF159EA87357C20A6AB1C7CE11FEE32FFDA4F57982C5F4B289B51CCB092ABD5571747095F342E8C234C8B12C006B7AAEC4162A2AA392DA8DFF822C4FED0E964788BA5126CA40DB8EEF46B7454FC60B9742502CCDD46D0DEDCF5861DED71B2F389733CBF5DBD5E913377AFFFEAFD269176DF2183F8FC7C078FCF50C7EAF9C588941B15DA834481FCF19DD082D7633A0EF3E4896CB9E6436389733CBF5DBD5E9D5E8D9A59859A8B601F8F2FECC0250C8CC7F00164DA146DA6F5DAA56C3B73B23E7726E8460B7C23C
X-C1DE0DAB: 0D63561A33F958A52EF6A6EFBDB43C8BA0F06EF541F76ED3AC0764A0D20A0778F87CCE6106E1FC07E67D4AC08A07B9B0A6C7FFFE744CA7FB9C5DF10A05D560A950611B66E3DA6D700B0A020F03D25A09EDCF5861DED71B2FF32E08699F8F45A1CDFF422315505062BA7CCD254A1CF5E833629329AA2D25E5
X-C8649E89: 1C3962B70DF3F0AD26C0D434D75DEB27F22D334B9B612B432CCB5A6D6581D03D0776B5B2C279835F17BCBE6708A5A68D02015372BE9702A20F84C43FA2038CDE3DE146DE6857D72CDEB7323C50A52AFEAC8CE95F42CF61090966F1585594D6159B815B7972F6FBBE7894B9023F5C129066BFC862880C174652EE4E5D9E54FDA44C41F94D744909CECE91D1F769AC3F588EBB7F9845D5049F9CB4C0EABAFD0B4C37E69C174A41D00C
X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr59cQFxbtK52nlS5dXYHM/vGJPPyhnCcOsWxjvstlFwfLDmG3SyZat9J5NbkWIjxq932/b2BQGyWkRn3AgzCpU/iMtBVD51WbvH0GkMdp0FX1YB//7MgRjFKDtzAHcKfpojwMUFqnUrer
X-F696D7D5: 1DeD6lt5UnY/fUsKeIs0lzdPoFv7BEpSOG24EIKoYNjqMV5tCw+fwA==

tcp порт 53 до бинда тоже открыл, так то письма ходят, но подскажите что этому майлу может быть еще нужно???

 

wolverin
()

Почему write(fd,..) висит?

Приветствую

В продолжении темы Рестартануть драйвер как?

нашел как из консоли бесконечно количество раз рестартить драйвер

systemctl stop ***.service
echo spi0.0 > /sys/bus/spi/drivers/flexfb/unbind 
echo spi0.0 > /sys/bus/spi/drivers/flexfb/bind
systemctl start ***.service

делают тоже самое на сях как

static int setSPI(bool mode)
{
    const char
        * flexfb,
        spi[] = "spi0.0";

    if (mode)
    {
        flexfb = "/sys/bus/spi/drivers/flexfb/bind";
        fputs("Start spi device\n", stderr);
    }
    else
    {
        flexfb = "/sys/bus/spi/drivers/flexfb/unbind";
        fputs("Stop spi device\n", stdout);
    }

    int rt = -1;
    int fd = open(flexfb, O_WRONLY);
    if (fd > 0)
    {
        if ((rt = write(fd, spi, sizeof(spi))) <= 0)
            fprintf(stderr, "ERROR set SPI: %d %s [%s]\n", errno, strerror(errno), flexfb);
        close(fd);
    }
    else
        fprintf(stderr, "ERROR open %s: %d %s\n", flexfb, errno, strerror(errno));

    return rt;
}

уже без всяких systemctl просто запускаю и останавливаю приложение и в какой то момент на write(fd не снимаемая БЛОКИРОВКА

где может быть у меня косяк?

 , ,

wolverin
()

Рестартануть драйвер как?

Приветствую

В продолжении темы Как рестартануть /dev/fb1 ???

как можно перезапустить из своего бинарника драйвер через ядро БЕЗ modprobe ???

 ,

wolverin
()

Как рестартануть /dev/fb1 ???

Приветствую.

Через /dev/fb1 с одноплатника реализовано подключение lcd экрана, который зараза по необъяснимым причинам иногда белеет.

Может есть способ не ребутить убунту для «сброса» внешнего устройства? В идеале бы еще узнать текущее состояние конечно.

Полагаю оно прячется где то в прерываниях, но как найти с которым связано?

cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
 16:          0          0          0          0     GICv2  25 Level     vgic
 17:          0          0          0          0     GICv2  50 Level     /soc/timer@01c20c00
 18:          0          0          0          0     GICv2  29 Level     arch_timer
 19:   90547909  139451125  142656932  143202842     GICv2  30 Level     arch_timer
 20:          0          0          0          0     GICv2  27 Level     kvm guest timer
 22:          0          0          0          0     GICv2 120 Level     1ee0000.hdmi, dw-hdmi-cec
 24:          0          0          0          0     GICv2 118 Level     1c0c000.lcd-controller
 25:          0          0          0          0     GICv2  82 Level     1c02000.dma-controller
 26:         25          0          0          0     GICv2  92 Level     sunxi-mmc
 27:      79801          0          0          0     GICv2  94 Level     sunxi-mmc
 28:          1          0          0          0     GICv2 103 Level     musb-hdrc.4.auto
 29:          0          0          0          0     GICv2 104 Level     ehci_hcd:usb1
 30:          0          0          0          0     GICv2 105 Level     ohci_hcd:usb2
 31:          0          0          0          0     GICv2 106 Level     ehci_hcd:usb3
 32:          0          0          0          0     GICv2 107 Level     ohci_hcd:usb6
 33:          0          0          0          0     GICv2 108 Level     ehci_hcd:usb4
 34:          0          0          0          0     GICv2 109 Level     ohci_hcd:usb7
 35:   85647492          0          0          0     GICv2 110 Level     ehci_hcd:usb5
 36:          0          0          0          0     GICv2 111 Level     ohci_hcd:usb8
 39:     624264          0          0          0     GICv2  63 Level     1c25000.ths
 41:     305355          0          0          0     GICv2 114 Level     eth0
 42: 3951995844          0          0          0     GICv2  97 Level     sun6i-spi
 45:        432          0          0          0     GICv2  32 Level     ttyS0
 46:     177618          0          0          0     GICv2  33 Level     ttyS1
 49:          0          0          0          0     GICv2  38 Level     mv64xxx_i2c
 50:          0          0          0          0     GICv2  39 Level     mv64xxx_i2c
 51:          0          0          0          0     GICv2  40 Level     mv64xxx_i2c
 52:          0          0          0          0     GICv2  72 Level     1f00000.rtc
106:          1          0          0          0  sunxi_pio_edge  44 Edge      usb0-id-det
129:          1          0          0          0  sunxi_pio_edge   3 Edge      k1
IPI0:          0          0          0          0  CPU wakeup interrupts
IPI1:          0          0          0          0  Timer broadcast interrupts
IPI2:   90852252  258982397  266588110  269015295  Rescheduling interrupts
IPI3:        760        582        624        629  Function call interrupts
IPI4:          0          0          0          0  CPU stop interrupts
IPI5:      88146      26774      27729      28640  IRQ work interrupts
IPI6:          0          0          0          0  completion interrupts
Err:          0

 ,

wolverin
()

Линковка extern вместо передачи указателя в C и С++?

Приветствую.

Вынес кусок кода в отдельный hpp, который использую в разных проектах. Из этого куска передаю указатель на метод в методы разного функционала скомпилированные в разных объектниках как на Сях, так и на С++

Все работает, НО можно ли сделать внешнее связывание одновременно как для Си, так и для С++ в одном проекте???

Например, я объявляю метод в разном функционале

для С++ в hpp просто как

extern void func(void * ptr)

для Си в секции

#ifdef __cplusplus
extern "C" {
#endif

extern void func(void * ptr)

#ifdef __cplusplus
}
#endif

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

MQTT.h:12:13: error: conflicting declaration of ‘void func(void*)’ with ‘C’ linkage
 extern void func(void * ptr);
             ^~~~~~~~~~~
In file included from IntercomIP.cpp:24:0:
SIP.hpp:36:13: note: previous declaration with ‘C++’ linkage
 extern void func(void * ptr);

По всякому уже попробовал ) Собирается только если будет как объектник выделенного кода, так и сам код включен в компиляцию бинарника, выглядит конечно это бредово.

 , , ,

wolverin
()

RTSP публикация надежна?

Приветствую.

В чужом решении с тысячами железок, которое переписываю, схема предоставление видео реализована через видео rtsp прокси сервер (rtsp-simple-server) + openvpn до каждой железки с ее rtsp сервером - само собой что такая архитектура обладает некоторой сложностью и как следствие не высокой надежностью.

Поскольку пока нет возможности выпилить видео прокси, есть частично проверенная идея на железках «перевернуть» сервер, используя если не сам ffmpeg, то его либы, выполняя с железки пуш rtsp подключение.

В прошлом году удалось втащить старый ffserver с новыми либами ффмпега в свой проект, что дало по быстрому реализовать свой rtsp сервер, в который видео передаю как раз с помощью пуша ртсп между своими же потоками через локальный интерфейс - проблем не замечено, но тут это будет не в единичном случае, а тысячи таких подключений через ентернет, хоть сам rtsp-simple-server такой способ и поддерживает как я проверил.

Это бы дало мне отказ он vpn и части php функционала на проксе. Или может есть другие более надежные способы выкинуть VPN в такой схеме ???

 ,

wolverin
()

std::bad_function_call на указатель метода класса

Приветствую.

В продолжении темы Вызов по указателю метода структуры вложенной в класс

Есть обработчик очереди класса в отдельном потоке

void CQueue::Handler(void)
{
    auto Get = [this](cmd_t & cmd) {
        std::unique_lock<std::mutex> ul(mtx);
        do {
            if (!abRun) return false;
        } while (!cv.wait_for(ul, std::chrono::seconds(1), [this]{ return !pq.empty(); }));

        cmd = pq.top();
        pq.pop();

        return true;
    };

    cmd_t cmd;
    while (Get(cmd))
        if (cmd.handle)
            (this->*(cmd.handle))(cmd.id, cmd.msg);
}

В саму очередь засовываю подобным образом из другого потока поступающих команд

pQ->Put(id, std::string(msg, msgLen), &CQueue::handle_pass);

частично описание класса

class CQueue
{
private:
    struct cmd_t {
        int8_t pri;
        std::string id, msg;
        void (CQueue::*handle)(const std::string & id, std::string & msg);
    };

    std::function<bool (const cmd_t &, const cmd_t &)> cmp = [](const cmd_t & l, const cmd_t & r){ return l.pri > r.pri; };

    std::priority_queue<cmd_t, std::vector<cmd_t>, decltype(cmp)> pq;

Все работает полагаю пока команды идут настолько «медленно», что CQueue::Handler успевает встать на условную переменную, но если удается за время вызова (this->(cmd.handle))(cmd.id, cmd.msg) засунуть в очередь несколько команд, то валится ошибка std::bad_function_call при вызове (this->(cmd.handle))

Разве нельзя одновременно передавать указатель на метод класса в другой поток и обращаться к нему???

 

wolverin
()

«без ключевое» шифрование конфига

Приветствую

Есть куча железок на убунте (может будет расбиан), которые могут быть физически стырены, необходимо зашифровать конфиги моего ПО на них, да так чтобы ключ-пароль сей не светился в самом бинарнике.

Ранее пользовал штатную библиотеку libgcrypt с алгоритмом AES в режиме CBC, поэтому из мыслей брать пароль и соль, например, mac и uuid диска, но кажется это тривиальным

Посоветуйте как можно решить подобную задачу, в идеале «штатными» средствами.

 ,

wolverin
()

Вызов по указателю метода структуры вложенной в класс

Приветствую.

Имеется класс вида

class CQueue
{
private:
    struct cmd_t {
        int8_t pri;
        std::string id, msg;
        void (CQueue::*handle)(const std::string & id, const std::string & msg);
    };
....
public:
    void handle_...(const std::string & id, const std::string & msg);
    void handle_push(const std::string & id, const std::string & msg);

int Put(const std::string & id, const std::string & msg, void (CQueue::*handle)(const std::string & id, const std::string & msg), const int8_t pri = 0);
void Handler(void);

из метода не этого класса добавляю в эту очередь и GCC не возмущается как

pQ->Put(id, std::string(msg, msgLen), &CQueue::handle_push);

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

void CQueue::Handler(void)
{
.....
    cmd_t cmd;
    while (Get(cmd))
        if (cmd.handle)
            (cmd.*handle)(cmd.id, cmd.msg);

но компилятор против, говорит нет никакого handle

так тоже пробовал и тут типы не совпадают

(cmd.*cmd.handle)(cmd.id, cmd.msg)

или вообще все это не правильно и надо городить на std::function ???

 

wolverin
()

Приоритетная очередь

Приветствую

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

Если с самой очередью приоритотов вроде есть понимание в использовании std::priority_queue (или лучше мудрить с heap???), то как организовать раздельную обработку каждого приоритета, чтобы длинные низкоприоритетные задачи не тормозили более высокие пока не соображу.

Пока только 2 вида, но может в будущем будет больше и не хочется тупо делать количество очередей просто по количеству приоритотов.

На чем такое реализовать на плюсах???

 

wolverin
()

Boost.Asio и несколько async_write/async_read за раз

И снова здравствуйте! )

Получилось ПОЧТИ что хотел - за одно подключение-рукопожатие при пиковом (за время полного цикла от подключения до записи в сокет) поступлении команд через mqtt удается отправить херову гору rest-запросов, затем происходит отключение и ожидание следующей порции.

Но вот что нормально НЕ работает, так это CPush::handle_read_status, получаю туда после первого нормального response какой то мусор с периодической ошибкой от буста Operation canceled

Описание

class CPush
{
private:
    std::deque<std::string> dq;

    std::mutex mtx;
    std::condition_variable cv;

    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> * psocket;

    std::string request;
    boost::asio::streambuf response;

    bool verify_certificate(bool preverified, boost::asio::ssl::verify_context & ctx);
    void handle_connect(const boost::system::error_code & error);
    void handle_handshake(const boost::system::error_code & error);
    void handle_write(const boost::system::error_code & error);
    void handle_read_status(const boost::system::error_code & error);
    void handle_read_header(const boost::system::error_code & error);
    void handle_read_content(const boost::system::error_code & error);

    void Write(void);
    int Get(std::string & http);

public:

    CPush(void) { std::cout << "PUSH client initialized" << std::endl; }

    int Put(const std::string & tokens, const std::string & cmd);

    bool Wait(void);
    void Handler(void);
};

Частично реализация

void CPush::handle_handshake(const boost::system::error_code & error)
{
    if (error)
        std::cerr << "Handshake failed: " << error.message() << std::endl;
    else
        Write();
}

void CPush::handle_write(const boost::system::error_code & error)
{
    if (error)
      std::cerr << "Write failed: " << error.message() << std::endl;
    else
    {
        std::cout << "Sending request OK!" << std::endl;

        boost::asio::async_read_until(*psocket,
                                response, "\r\n",
                                boost::bind(&CPush::handle_read_status,
                                            this,
                                            boost::asio::placeholders::error));

        Write();
    }
}

void CPush::handle_read_status(const boost::system::error_code & error)
{
    if (error)
        std::cout << "Error read status: " << error.message() << std::endl;
    else
    {
std::cout << "!!!!!!!!!!!!!!!!!!!\n" << &response << "\n!!!!!!!!!!!!!!!!!!!\n" << std::flush;
        // Check that response is OK.
        std::istream response_stream(&response);
        std::string http_version;
        response_stream >> http_version;
        unsigned int status_code;
        response_stream >> status_code;
        std::string status_message;
        std::getline(response_stream, status_message);


        if (!response_stream || http_version.substr(0, 5) != "HTTP/")
        {
            std::cout << "Invalid response\n";
            return;
        }

        if (status_code != 200)
        {
            std::cout << "Response returned with status code ";
            std::cout << status_code << "\n";
//          return;
        }

/*      // Read the response headers, which are terminated by a blank line.
        boost::asio::async_read_until(*psocket,
                                        response, "\r\n\r\n",
                                        boost::bind(&CPush::handle_read_header,
                                                    this,
                                                    boost::asio::placeholders::error));
*/    }
}

int CPush::Get(std::string & http)
{
    std::lock_guard<std::mutex> lock(mtx);

    int rt = dq.size();
    if (rt > 0)
    {
        http = dq.front();
        dq.pop_front();
    }

    return rt;
}

void CPush::Write(void)
{
    if (Get(request) > 0)
        boost::asio::async_write(*psocket,
                                boost::asio::buffer(request),
                                boost::bind(&CPush::handle_write,
                                            this,
                                            boost::asio::placeholders::error));
}

int CPush::Put(const std::string & tokens, const std::string & cmd)
{
    std::string json("{\"registration_ids\":[" + tokens + "],"
                    "\"notification\":null,"
....................
                    "\"priority\":\"high\","
                    "\"time_to_live\":15}");

    mtx.lock();

    dq.push_back("POST " + std::string(GOOGLE_API) + " HTTP/1.1\r\n"
                "Host: " + GOOGLE_HOST + "\r\n" // << ":" << port
                "Content-Type: application/json; charset=utf-8\r\n"
                "Content-Length: " + std::to_string(json.size()) + "\r\n"
                "Authorization: key=" + push_key + "\r\n\r\n" + json);
    int rt = dq.size();

    mtx.unlock();
    cv.notify_one();

    return rt;
}

bool CPush::Wait(void)
{
    std::unique_lock<std::mutex> ul(mtx);
    do {
        if (!abRun) return false;
    } while (!cv.wait_for(ul, std::chrono::seconds(1), [this]{ return dq.size() > 0; }));

    return true;
}

void CPush::Handler(void)
{
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(GOOGLE_HOST, GOOGLE_PORT);
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

    boost::asio::ssl::context context(boost::asio::ssl::context::sslv23);
    context.set_default_verify_paths();

    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket(io_service, context);
    socket.set_verify_mode(boost::asio::ssl::context::verify_none);
    socket.set_verify_callback(boost::bind(&CPush::verify_certificate, this, _1, _2));

    psocket = &socket;

    boost::asio::async_connect(psocket->lowest_layer(),
                                iterator,
                                boost::bind(&CPush::handle_connect,
                                            this,
                                            boost::asio::placeholders::error));

    io_service.run();
std::cout << "00000000000000000000000000000000000" << std::endl;
}

запускаю все это дело из основного потока

std::thread ([](void){ while (pPush->Wait()) pPush->Handler(); }).detach();

и добавляю команды из другого потока по событию

pPush->Put(tokens_, cmd_);

 , ,

wolverin
()

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