LINUX.ORG.RU

Сообщения wolverin

 

Как привести между собой void* и std::iterrator?

 

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

Нужно в асинхронную С либу отправлять разные типы данных без копирования памяти, которая делает обратный вызов и в нем уже можно освободить.

Первое что приходит в голову сделать объект вида std::list<std::shared_ptr<T>>, при вызове передавать итератор, а при обратном удалять итератор из std::list, но подцепить к вызову естественно можно только void* (никаких преобразование конечно внутри либы с этим указателем не делается).

Как сделать преобразование типов между std::list<std::shared_ptr<T>>::iterator и void*? или как то по другому это делается (не нагуглил)?

wolverin
()

SRTP через libsrtp или libav?

 ,

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

Постепенно двигаюсь в реализации WebRTC, DTLS согласование с браузером выполнил через OpenSSL, для STUN/ICE использую libnice, в подключение которого нужно засовывать srtp пакеты.

Из опыта - даже rtp для rtsp не делаю сам, все через libav даже сетевой обмен - да, получаю ограничение в производительности на количество трансляций на один поток, но по ТЗ у меня их не больше 2х, пока сойдет.

Сейчас наделав кучу кольцевых буферов (в том числе для многопоточной реализации вебртс) стою перед задачей как из AVPacket наделать srtp пакетов для libnice - чисто архитектурный вопрос - через какую либу бы посоветовали???

wolverin
()

Почему такая скорость передачи RTP?

 , ,

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

Для реализации WebRTC сервера, переделал в своем коде на базе libav/ffmpeg/ffserver «передачу» кадров между камерой и своим RTSP сервером вместо lo интерфейса на кольцевой буфер заранее заданной длины, поскольку это место перестало быть узким - наблюдаю такую картину - RTP/UDP пакеты RTSP сервером при старте в один поток в течении нескольких секунд отдаются с такой задержкой, что с камеры (15fps) успевает прийти несколько десятков кадров (пока проверял на rtsp камере, но думаю и на usb будет тоже самое), все это длится первых секунд может 5-10 трансляции, при «большой» длине кольца камера (голова) не успевает догнать сервер (хвост), но со временем сервер начинает догонять голову и уже после этого как и хотелось работает все последовательно, задержка становится минимально возможной.

RTSP/RTP сервер однопоточный, его тормоза на 10 потоках (когда камера гарантированно последовательно догоняет позицию буфера передаваемую ртсп-клиентам) логически возможно понятны, но почему такое плавание скорости происходит???

Передача через 1 коммутатор с одноплатника выполняется, камера подцеплена к нему «локально» через вторую сетевку.

wolverin
()

получить rtsp из zoneminder?

 ,

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

zoneminder захватывает в том числе с аналоговых камер видео, как то можно из него вытащить rtsp поток? что то не гуглится никак.

wolverin
()

post-up в interfaces не работает

 , , ,

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

В debian 9 в /etc/network/interfaces прописано для влана

auto eth0
iface eth0 inet static
    address             zzz
    netmask             255.255.255.0
    post-up ethtool -K eth0 tx off rx off


auto eth0.24
iface eth0.24 inet static
    address             xxx
    netmask             255.255.255.252
    gateway             yyy
    post-up             /bin/ip rule add from xxx table rostelecom
    post-up             /bin/ip route add default via yyy dev eth0.24 table rostelecom
    post-down           /bin/ip rule del from xxx table rostelecom
    post-down           /bin/ip route del default via yyy table rostelecom
    vlan_raw_device     eth0

вроде как первый для етх0 работает post-up, а для етп0.24 приходится после ребута вручную маршруты добавлять, что я делаю не так?

wolverin
()

WebRTC адрес от браузера

 

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

Передаю браузеру кандидатов в sdp виде

...
a=setup:passive
a=ice-ufrag:IT54
a=ice-pwd:OnFL2Ee+hnsKEX4xh+jl4e
a=candidate:1 1 UDP 2013266431 fe80::ca4d:44ff:fe20:1e8b 39133 typ host
a=candidate:2 1 TCP 1015023359 fe80::ca4d:44ff:fe20:1e8b 9 typ host tcptype active
...и тд...
a=end-of-candidates
a=send

Все ок, браузер понял, отвечает мне своим кандидатом

...
a=candidate:3891818760 1 udp 2113937151 f971c089-ea36-4c38-8395-864a79fc694f.local 60013 typ host generation 0 network-cost 999
a=ice-ufrag:EU/h
a=ice-pwd:z+rv7a3jPh/i9bzs9JGJHS0a
a=ice-options:trickle
...

Как теперь вот это f971c089-ea36-4c38-8395-864a79fc694f.local непонятное, конвернуть в то, что поймет getaddrinfo ? И что вообще это такое и с чем едят?

wolverin
()

RTP over VPN потери ~100%

 , ,

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

Через прокси mediamtx на централизованном сервере забирается стрим с условной «камеры», RTP в UDP, OpenVPN тоже UDP, VLC не показывает ничего (битрейт показывает порядка 10-20кбс), на прокси в логах потери ртп пакетов, если пущу трафик через TCP напрямую на проксю - видео показывает.

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

Если глянуть tcpdump на сервере, то на впн интерфейсе вижу пакеты по 1472, которые местами уменьшаются до меньших величин, при этом если на сервере уже на интерфейсе с адреса, то всегда пакеты не более 784/780 байт, меньше могут, больше редкие исключения.

В traceroute криминала не вижу, до 30мс после 9 прыжков (но до шлюза провайдера или роутера, точно не знаю, адрес от stun сервера получаю)

wolverin
()

Где купить серверный хдд на 2тб?

 

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

В продолжении темы RAID10 в mdadm сломался

Где сейчас можно взять НОВЫЙ ентерпрайз 2тб по цене не за 8тб???

Чот в магазах аля ситилинк/днс такие под 30к, чуть добавить и 8тб можно взять.

ЗЫ. Взял на озоне ST2000NM0008 за 15к - привезли конечно же восстановленную паль.

wolverin
()

RAID10 в mdadm сломался

 ,

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

Такая картина, выпало одновременно 2 диска

# cat /proc/mdstat
Personalities : [raid10] [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4]
md1 : active raid10 sdc2[1] sdb2[2]
      1848402944 blocks super 1.2 512K chunks 2 near-copies [4/2] [_UU_]
      bitmap: 1/14 pages [4KB], 65536KB chunk

md0 : active raid10 sdc1[1] sdb1[2]
      104792064 blocks super 1.2 512K chunks 2 near-copies [4/2] [_UU_]

# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Tue Jul 21 10:03:05 2020
        Raid Level : raid10
        Array Size : 104792064 (99.94 GiB 107.31 GB)
     Used Dev Size : 52396032 (49.97 GiB 53.65 GB)
      Raid Devices : 4
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Mon Jan 12 11:48:06 2026
             State : clean, degraded
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       1       8       33        1      active sync set-B
       2       8       17        2      active sync set-A
       -       0        0        3      removed

Теперь в файловой системе ничего не дается сделать и обратно добавить диски тоже не хотит, советов много, но что сделать чтобы все окончательно не рухнуло? резервного сервера и дисков (пока) нет

# mdadm --manage /dev/md0 --add /dev/sda1
mdadm: cannot load array metadata from /dev/md0
wolverin
()

Поменять текст внутри <label><input..>

 ,

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

Подскажите, что то никак не гуглится у меня

        <div id="date">Дата работ<br><br>
            <div id="date_adr">Адрес</div><br>
            <label id="date_old"><input type="radio" name="date_sel" value="123" checked="checked">321</label><br>
            <label>
                <input type="radio" name="date_sel">
                <input type="date" id="date_new">
                <input type=text id="date_exp" maxlength="128">
            </label>
        </div>

Как в через jquery поменять текст 321 без добавления span???

Простой $('#date_old').text('блабла') затирает input.

wolverin
()

SSL_read:uninitialized

 , , ,

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

Пытаюсь с хромом по webrtc поговорить, обменялся sdp описанием содержащим sha-256 отпечаток, произошло ice соединение и теперь шлет мне браузер какие то 157 байт аж 3 раза для создания DTLS подключения, делаю что то вроде

    SSL_CTX * ssl_ctx = SSL_CTX_new(DTLS_method());
    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, cb_dtls_verify);
    SSL_CTX_set_tlsext_use_srtp(ssl_ctx, "SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32");

...dtls_generate_keys(&ssl_cert, &ssl_key)...;

    SSL_CTX_use_certificate(ssl_ctx, ssl_cert);
    SSL_CTX_use_PrivateKey(ssl_ctx, ssl_key);
    SSL_CTX_check_private_key(ssl_ctx);
    SSL_CTX_set_read_ahead(ssl_ctx, 1);

...fingerprint...

    SSL * ssl = SSL_new(ssl_ctx)
    SSL_set_info_callback(ssl, cb_dtls);
    BIO * read_bio = BIO_new(BIO_s_mem());
    BIO_set_mem_eof_return(read_bio, -1);
.....
    SSL_set_bio(ssl, read_bio, write_bio);
.....

    int written = BIO_write(read_bio, buf, len);
    char data[DTLS_BUFFER_LEN];
--->int read = SSL_read(ssl, &data, DTLS_BUFFER_LEN);
    if(read < 0)
    {
        if(SSL_get_error(ssl, read) == SSL_ERROR_SSL)
        {
            char err[256];
            ERR_error_string_n(ERR_get_error(), err, sizeof(err));
            g_printerr("ERROR SSL handshake (%s)\n", err);
        }
        else
            g_printerr("ERROR SSL read (%s)\n", ERR_reason_error_string(ERR_get_error()));

        return;
    }

И получаю ошибку в этом месте SSL_ERROR_SSL error:140DF114:SSL routines:SSL_read:uninitialized

wolverin
()

Рассуждения про WebRTC на C/C++

 ,

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

Пока на берегу рассудите меня все таки - начал потихоньку втаскивать это чудище в свой проект по записи архивов на soc, для такой же распределенной трансляции в первом пределе только как p2p. За базу беру libnice и libav, примером использую код Janus.

Но вот уже на который техсобес хожу в работающие проекты - ну как бэ НИКТО такой «ерундой» не занимается, старый rtsp или подобное, сегодня так рассказали как все это дело еще и инкапсулируют в свой протокол чтоб от vpn уйти… Разрабы из OpenIPC говорят тяжёлый он и не будут они его на камерах внедрять…

Нет в вакансиях в новые проекты смотрю бывает указывают, но как исключение как будто!?

wolverin
()

<select> из нескольких колонок?

 ,

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

Подскажите как то можно просто на этом теге сделать выпадающий список, в котором хотя бы 2 колонки будут? Без кучи вложений div/span и портянки CSS.

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

wolverin
()

Как извлечь ESD файл из письма?

 , ,

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

Высылает банк письма в формате DIRECTUM ESD с вложением, которое почтовые клиенты (например, munpack) видят как smime.p7m, при этом само описание вложения письма имеет вид

Content-Type: application/pkcs7-mime; smime-type=enveloped-data;
Content-Disposition: attachment; filename="smime.p7m"
Content-Transfer-Encoding: base64

вариации в духе

openssl smime -decrypt -in smime.p7m -recip bank.crt -noverify -inkey primary.key -out txt.txt

пишут ошибку

unable to load signing key file
139705852929216:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: ANY PRIVATE KEY

очевидно потому что openssl ничего не знает про шифрование ГОСТ

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

wolverin
()

Как сдвинуть std::lower_bound?

 ,

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

Имеется большой список со значениями (пускай будет vector, хотя использую deque) - как бы найти первый ближайший элемент, который меньше или равен значению???

На основании (а так же из-за наличия только 11/14) запили реплику

    ssize_t cnt = q.size() - 1;
    size_t m, l = 0, i = 0;
    while (cnt > 0)
    {
        i = l;
        m = cnt / 2;
        i += m;
        if (q.at(i) < val)
        {
            l = ++i;
            cnt -= m + 1
        }
        else
            cnt = m;
    }

все бы хорошо, НО находится всегда первый после val, std::upper_bound тоже пробовал реализовать, но всегда получаю последний элемент, поскольку почти никогда не имею значения val в массиве.

З.Ы. сдвинуться на назад можно на элемент, но хочется понять почему при бинарном поиске получается индекс справа, а не слева!?

или например еще один из вариантов бинарного поиска

    size_t m, l = 0, r = q.size() - 1;
    while (l < r)
    {
        m = (l + r) / 2;
        if (q.at(m) < val)
            l = m + 1;
        else if (q.at(m) > val)
            r = m - 1;
        else
            break;
    }

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

З.Ы. и тут результат конечно можно перепроверить после цикла, но как бы гарантированно сразу получить элемент слева от числа???

wolverin
()

vlan на cisco без консоли

 ,

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

Как бы вот так настроить на порту тегированный и не тегированный трафик из дефолтного влан 1, чтобы находясь на этом порту через ssh не потерять доступ?

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

switch#show vlan

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Gi0/1, Gi0/2, Gi0/3, Gi0/4, Gi0/5, Gi0/6, Gi0/7, Gi0/8, Gi0/9, Gi0/10, Gi0/11, Gi0/12, Gi0/14, Gi0/15
                                                Gi0/16, Gi0/17, Gi0/18, Gi0/19, Gi0/20, Gi0/21, Gi0/22, Gi0/23
13   Souz                             active    Gi0/13
24   Rostelecom                       active    Gi0/24
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup

VLAN Type  SAID       MTU   Parent RingNo BridgeNo Stp  BrdgMode Trans1 Trans2
---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------
1    enet  100001     1500  -      -      -        -    -        0      0
13   enet  100013     1500  -      -      -        -    -        0      0
24   enet  100024     1500  -      -      -        -    -        0      0
1002 fddi  101002     1500  -      -      -        -    -        0      0
1003 tr    101003     1500  -      -      -        -    -        0      0
1004 fdnet 101004     1500  -      -      -        ieee -        0      0
1005 trnet 101005     1500  -      -      -        ibm  -        0      0

Remote SPAN VLANs
------------------------------------------------------------------------------


Primary Secondary Type              Ports
------- --------- ----------------- ------------------------------------------

Но нужно чтобы 23 порт получал нетегированный vlan 1 и тегированный vlan 13, при этом я сам нахожусь на этом порту через SSH (через несколько комков)

т.е. если я сделаю

interface GigabitEthernet 0/23
switchport trunk allow vlan 13

то мне уже не удастся выполнить!?

switchport trunk native vlan 1
wolverin
()

Прошивка для Cisco WS-C2960G-24TC-L?

 ,

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

Подскажите где свободно в нынешних условиях скачать можно? Сейчас 12.2(35)SE5 C2960-LANBASE-M

wolverin
()

Как получить уже вычисленный hash в std::unordered_map?

 

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

Не понимаю из документации так можно зачем то

std::unordered_map<std::string, Т> umap;
umap["блабла"] = blabla;

auto hash_fn = umap.hash_function();
size_t hash_value = hash_fn("блабла");

Но вот если ключ длинный - как избежать повторного вычисления? Хотелось бы дополнительно использовать это значение.

ЗЫ. C++11/14

wolverin
()

Права пользователю на asterisk?

 ,

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

От рута и через судо все работает, никак не удается с пользователем в группе выполнить asterisk -r

Варианты ошибок в зависимости от пользовательской учетки

$ asterisk -r
-bash: asterisk: команда не найдена

Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)

Все права файловые права есть на этот run

$ ls -l  /var/run/asterisk/
итого 8
-rwxr-xr-x 1 asterisk asterisk 786 дек 11 18:40 alt.asterisk.canary.tweet.tweet.tweet
srwxr-xr-x 1 asterisk asterisk   0 дек 10 18:11 asterisk.ctl
-rw-r--r-- 1 asterisk asterisk   4 дек 10 18:11 asterisk.pid

подозреваю selinux но это не точно

wolverin
()

Как еще обновить самого себя?

 ,

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

Как я понимаю обычное решение это скопировать куда то новый бинарник, затем запустить его с какими то параметрами из своего процесса через exec* и уже в нем положить себя на свое старое место - неудобно в этом то, что нужно проверяться из какого места загружен и либо снова запускаться из старого места либо все время помнить что запущен из «клона», а нет ли более хитрого способа без внешнего кода на C/C++ подменить свой бинарник во время его исполнения???

может есть какие то штатные средства ОС?

wolverin
()