LINUX.ORG.RU

Сообщения wolverin

 

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

Форум — Admin

Приветствую

Некоторые изменения нужно внести в конфиг в частности 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
()

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

Форум — Development

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

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

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

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

 

wolverin
()

No space left on device

Форум — Admin

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

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

# 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

Форум — Admin

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

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

 ,

wolverin
()

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

Форум — Development

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

Сначала написал многа букв в вопросе, но решил спросить просто кодом раз уж всегда требуют его - почему через обычный метод 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

Форум — Admin

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

Очередная проблема после поднятия версии 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

Форум — Admin

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

После поднятия версии 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 не грузится

Форум — Admin

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

После поднятия версии 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?

Форум — Development

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

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

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

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

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

 ,

wolverin
()

dkim pubkey_unavailable

Форум — Admin

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

савчера вдрух 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,..) висит?

Форум — Development

Приветствую

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

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

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
()

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

Форум — Development

Приветствую

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

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

 ,

wolverin
()

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

Форум — Linux-hardware

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

Через /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 и С++?

Форум — Development

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

Вынес кусок кода в отдельный 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 публикация надежна?

Форум — Development

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

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

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

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

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

 ,

wolverin
()

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

Форум — Development

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

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

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

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
()

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

Форум — Development

Приветствую

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

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

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

 ,

wolverin
()

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

Форум — Development

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

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

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
()

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

Форум — Development

Приветствую

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

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

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

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

 

wolverin
()

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

Форум — Development

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

Получилось ПОЧТИ что хотел - за одно подключение-рукопожатие при пиковом (за время полного цикла от подключения до записи в сокет) поступлении команд через 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 подписка на новые темы